Python 3.3의 새로운 기능¶
This article explains the new features in Python 3.3, compared to 3.2. Python 3.3 was released on September 29, 2012. For full details, see the changelog.
더 보기
PEP 398 - Python 3.3 Release Schedule
Summary – Release highlights¶
New syntax features:
New
yield fromexpression for generator delegation.The
u'unicode'syntax is accepted again forstrobjects.
New library modules:
faulthandler(helps debugging low-level crashes)ipaddress(high-level objects representing IP addresses and masks)lzma(compress data using the XZ / LZMA algorithm)unittest.mock(replace parts of your system under test with mock objects)venv(Python virtual environments, as in the popularvirtualenvpackage)
New built-in features:
Reworked I/O exception hierarchy.
Implementation improvements:
Rewritten import machinery based on
importlib.More compact unicode strings.
더 간결해진 속성 딕셔너리.
개선된 라이브러리 모듈:
decimal 모듈용 C 가속기.
email 모듈에서의 향상된 유니코드 처리 (provisional).
보안 개선 사항:
해시 난수화가 기본적으로 켜집니다.
사용자에게 노출되는 변경 사항 목록의 포괄적인 내용은 계속 읽어 주십시오.
PEP 405: Virtual Environments¶
가상 환경은 시스템 전체 기본 설치를 공유하면서도 별도의 Python 설정을 만들도록 도와 유지 관리가 용이합니다. 가상 환경은 자체적인 사설 사이트 패키지 집합(즉, 로컬에 설치된 라이브러리)을 가지고 있으며, 옵션으로 시스템 전체 사이트 패키지와 분리될 수 있습니다. 그 개념과 구현은 인기 있는 virtualenv 서드파티 패키지에서 영감을 얻었으나, 인터프리터 코어와의 긴밀한 통합으로부터 이점을 누립니다.
이 PEP는 프로그래밍 방식의 접근을 위해 venv 모듈과 명령줄 접근 및 관리를 위한 pyvenv 스크립트를 추가합니다. Python 인터프리터는 가상 환경의 디렉토리 트리의 베이스를 알리는 파일인 pyvenv.cfg 파일을 확인합니다.
더 보기
- PEP 405 - 파이썬 가상 환경
Carl Meyer가 작성하고 Carl Meyer와 Vinay Sajip이 구현한 PEP
PEP 420: 묵시적 이름 공간 패키지¶
__init__.py 마커 파일가 필요 없고 여러 경로 세그먼트에 걸쳐 자동으로 확장할 수 있는 패키지 디렉터리에 대한 네이티브 지원 (네임스페이스 패키지에 대한 다양한 서드파티 접근 방식( :pep:`420`에 설명됨)에서 영감을 받음)
더 보기
- PEP 420 - 묵시적 이름 공간 패키지
Eric V. Smith가 작성하고 Eric V. Smith와 Barry Warsaw가 구현한 PEP
PEP 3118: 새로운 MemoryView 구현 및 버퍼 프로토콜 문서화¶
:pep:`3118`의 구현이 크게 개선되었습니다.
새로운 MemoryView 구현은 다중 충돌 보고서로 이어진 Py_buffer 구조체 내 동적으로 할당된 필드의 전체 소유권 및 수명 문제를 포괄적으로 수정했습니다. 또한, 비연속적이거나 다차원 입력에 대해 충돌했거나 잘못된 결과를 반환했던 여러 함수도 수정되었습니다.
MemoryView 객체는 이제 소비자 요청 유형을 확인하는 PEP-3118 호환 getbufferproc()를 갖게 되었습니다. 많은 새로운 기능이 추가되었으며, 대부분은 비연속적 배열 및 하위 오프셋을 가진 배열에 대한 완전한 일반성으로 작동합니다.
문서가 업데이트되어 내보내기(exporters)와 소비자는(consumers) 모두 책임이 명확하게 설명되었습니다. 버퍼 요청 플래그는 기본 및 복합 플래그로 그룹화됩니다. 비연속적 및 다차원 NumPy 스타일 배열의 메모리 레이아웃이 설명되어 있습니다.
기능 (Features)¶
struct 모듈 구문 내의 모든 네이티브 단일 문자 포맷 지정자(선택적으로 ‘@’로 접두사 붙임 가능)가 이제 지원됩니다.
제한 사항과 함께, cast() 메서드는 C-연속 배열의 포매트와 모양을 변경할 수 있도록 합니다.
모든 배열 유형에 대해 다차원 리스트 표현이 지원됩니다.
모든 배열 유형에 대해 다차원 비교가 지원됩니다.
해시 가능한(읽기 전용) 형식이 B, b 또는 c인 일차원 메모리 뷰는 이제 해시 가능합니다. (Contributed by Antoine Pitrou in bpo-13411.)
임의의 1-D 배열 유형 슬라이싱을 지원합니다. 예를 들어, 음수 스텝을 사용하여 메모리 뷰를 O (1) 시간에 역순으로 뒤집는 것이 가능해졌습니다.
API 변경 사항¶
최대 차원 수는 64로 공식 제한됩니다.
빈 shape, strides 및 suboffsets의 표현은 이제
None대신 빈 튜플을 사용합니다.‘B’ 형식(부호 없는 바이트)으로 메모리 뷰 요소를 접근하면 이제 정수가 반환됩니다 (struct 모듈 문법에 따른 것입니다). bytes 객체를 반환하려면 먼저 뷰를 ‘c’로 캐스팅해야 합니다.
memoryview 비교는 이제 오퍼랜드의 논리적 구조를 사용하며 모든 배열 요소를 값에 따라 비교합니다. struct 모듈 문법의 모든 형식 문자열이 지원됩니다. 인식되지 않은 형식 문자열을 가진 뷰도 허용되지만, 뷰 내용과 관계없이 항상 같지 않다고 비교됩니다.
추가적인 변경 사항은 Build and C API Changes 와 Porting C code 에서 확인하십시오.
(Contributed by Stefan Krah in bpo-10181.)
더 보기
PEP 3118 - 버퍼 프로토콜 개정
PEP 393: 유연한 문자열 표현¶
유니코드 문자열 타입은 이제 표현된 문자열의 가장 큰 유니코드 순서 값(1, 2 또는 4바이트)에 따라 여러 내부 표현을 지원하도록 변경되었습니다. 이는 일반적인 경우 공간 효율적인 표현을 가능하게 하지만, 모든 시스템에서 전체 UCS-4에 대한 접근을 제공합니다. 기존 API와의 호환성을 위해 여러 표현 형태가 병렬로 존재할 수 있으며, 시간이 지남에 따라 이러한 호환성은 단계적으로 제거될 예정입니다.
Python 측면에서는 이 변경으로 인한 단점이 없어야 합니다.
C API 측면에서 :pep:`393`은 완벽하게 하위 호환됩니다. 레거시 API는 최소 5년 동안 사용 가능해야 합니다. 레거시 API를 사용하는 애플리케이션은 메모리 감소의 전체적인 이점을 얻지 못하거나, 심지어 더 많은 메모리를 사용할 수도 있습니다 (왜냐하면 Python이 각 문자열에 대해 두 가지 버전(레거시 형식 및 새로운 효율적 저장소)을 유지해야 할 수 있기 때문입니다).
기능성¶
:pep:`393`에 의해 도입된 변경 사항은 다음과 같습니다:
Python은 이제 Non-BMP 코드 포인트(즉,
U+0000부터U+10FFFF까지)의 전체 범위를 항상 지원합니다. Narrow 및 wide build 간의 구분이 더 이상 존재하지 않으며, Python은 Windows에서도 wide build와 유사하게 동작합니다.narrow build가 사라지면서 narrow build에 특정한 문제들도 수정되었는데, 예를 들면 다음과 같습니다:
len()은 이제 Non-BMP 문자에 대해 항상 1을 반환하므로len('\U0010FFFF') == 1입니다:surrogate pair는 문자열 리터럴에서 재결합되지 않으므로,
'\uDBFF\uDFFF' != '\U0010FFFF'입니다.Non-BMP 문자의 인덱싱 또는 슬라이싱은 예상된 값을 반환하므로,
'\U0010FFFF'[0]는 이제'\U0010FFFF'를 반환하고'\uDBFF'를 반환하지 않습니다.표준 라이브러리의 모든 다른 함수들은 이제 Non-BMP 코드 포인트를 올바르게 처리합니다.
sys.maxunicode의 값은 이제 항상1114111(16진수로0x10FFFF)입니다.PyUnicode_GetMax()함수는 하위 호환성을 위해 여전히0xFFFF또는0x10FFFF를 반환하지만, 새로운 Unicode API와 함께 사용되어서는 안 됩니다 (참조 bpo-13054)../configure플래그--with-wide-unicode가 제거되었습니다.
성능 및 자원 사용량¶
유니코드 문자열의 저장은 이제 문자열에서 가장 높은 코드 포인트를 기준으로 달라집니다:
순수 ASCII 및 Latin1 문자열(
U+0000-U+00FF)은 코드 포인트당 1바이트를 사용합니다.BMP 문자열(
U+0000-U+FFFF)은 코드 포인트당 2바이트를 사용합니다.Non-BMP 문자열(
U+10000-U+10FFFF)은 코드 포인트당 4바이트를 사용합니다.
주요한 점은 대부분의 애플리케이션에서 문자열 저장소의 메모리 사용량이 크게 감소해야 한다는 것입니다. 특히 이전 와이드 유니코드 빌드와 비교했을 때 그렇습니다. 왜냐하면 여러 경우에 국제적인 컨텍스트에서도 문자열이 순수 ASCII로 저장되기 때문입니다 (예: XML 조각, HTTP 헤더, JSON 인코딩된 데이터 등). 또한, 같은 이유로 사소하지 않은 애플리케이션의 CPU 캐시 효율성도 높아지기를 기대합니다. Django 벤치마크에서 볼 수 있듯이, Python 3.3의 메모리 사용량은 Python 3.2보다 두세 배 작고, Python 2.7보다는 약간 더 개선되었습니다 (자세한 내용은 PEP 참조).
더 보기
- [msgid] PEP 393 - Flexible String Representation
[msgid] PEP written by Martin von Löwis; implementation by Torsten Becker and Martin von Löwis.
[msgid] PEP 397: Python Launcher for Windows¶
[msgid]
The Python 3.3 Windows installer now includes a py launcher application that can be used to launch Python applications in a version independent fashion.
[msgid]
This launcher is invoked implicitly when double-clicking *.py files. If only a single Python version is installed on the system, that version will be used to run the file. If multiple versions are installed, the most recent version is used by default, but this can be overridden by including a Unix-style “shebang line” in the Python script.
[msgid]
The launcher can also be used explicitly from the command line as the py application. Running py follows the same version selection rules as implicitly launching scripts, but a more specific version can be selected by passing appropriate arguments (such as -3 to request Python 3 when Python 2 is also installed, or -2.6 to specifically request an earlier Python version when a more recent version is installed).
[msgid] 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.)
더 보기
- [msgid] PEP 397 - Python Launcher for Windows
[msgid] PEP written by Mark Hammond and Martin v. Löwis; implementation by Vinay Sajip.
[msgid] Launcher documentation: Python Install Manager<br> 설치 관리자
[msgid] Installer PATH modification: Python Install Manager<br> 설치 관리자
[msgid] PEP 3151: Reworking the OS and IO exception hierarchy¶
[msgid] The hierarchy of exceptions raised by operating system errors is now both simplified and finer-grained.
[msgid]
You don’t have to worry anymore about choosing the appropriate exception type between OSError, IOError, EnvironmentError, WindowsError, mmap.error, socket.error or select.error. All these exception types are now only one: OSError. The other names are kept as aliases for compatibility reasons.
[msgid]
Also, it is now easier to catch a specific error condition. Instead of inspecting the errno attribute (or args[0]) for a particular constant from the errno module, you can catch the adequate OSError subclass. The available subclasses are the following:
[msgid]
BlockingIOError[msgid]
ChildProcessError[msgid]
ConnectionError[msgid]
FileExistsError[msgid]
FileNotFoundError[msgid]
InterruptedError[msgid]
IsADirectoryError[msgid]
NotADirectoryError[msgid]
PermissionError[msgid]
ProcessLookupError[msgid]
TimeoutError
[msgid]
And the ConnectionError itself has finer-grained subclasses:
[msgid]
BrokenPipeError[msgid]
ConnectionAbortedError[msgid]
ConnectionRefusedError[msgid]
ConnectionResetError
[msgid]
Thanks to the new exceptions, common usages of the errno can now be avoided. For example, the following code written for Python 3.2:
from errno import ENOENT, EACCES, EPERM
try:
with open("document.txt") as f:
content = f.read()
except IOError as err:
if err.errno == ENOENT:
print("document.txt file is missing")
elif err.errno in (EACCES, EPERM):
print("You are not allowed to read document.txt")
else:
raise
[msgid]
can now be written without the errno import and without manual inspection of exception attributes:
try:
with open("document.txt") as f:
content = f.read()
except FileNotFoundError:
print("document.txt file is missing")
except PermissionError:
print("You are not allowed to read document.txt")
더 보기
- [msgid] PEP 3151 - Reworking the OS and IO Exception Hierarchy
[msgid] PEP written and implemented by Antoine Pitrou
[msgid] PEP 380: Syntax for Delegating to a Subgenerator¶
[msgid]
PEP 380 adds the yield from expression, allowing a generator to delegate part of its operations to another generator. This allows a section of code containing 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.
서브 제너레이터로 위임하는 용도를 주로 염두에 두고 설계되었지만, yield from 표현식은 임의의 서브 이터레이터에 대한 위임을 실제로 허용합니다.
단순한 이터레이터의 경우, yield from iterable 은 본질적으로 for item in iterable: yield item 을 간결하게 줄인 형태일 뿐입니다:
>>> def g(x):
... yield from range(x, 0, -1)
... yield from range(x)
...
>>> list(g(5))
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]
그러나 일반적인 루프와 달리, yield from 은 서브 제너레이터가 호출 스코프로부터 보낸(sent) 값과 던져진(thrown) 값을 직접 수신하고 외곽 제너레이터에 최종 값을 반환할 수 있도록 합니다:
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
이 변경을 주도하는 주요 원칙은 send 및 throw 메서드와 함께 사용되도록 설계된 제너레이터조차도 단일 대형 함수가 여러 서브함수로 분리될 수 있는 것처럼 쉽게 여러 개의 서브제너레이터로 나눌 수 있도록 하는 것입니다.
더 보기
- PEP 380 - 서브제너레이터로 위임하기 위한 구문
Greg Ewing이 작성하고; Renaud Blanch, Ryan Kelly 및 Nick Coghlan이 구현했으며; Zbigniew Jędrzejewski-Szmek 및 Nick Coghlan이 문서화했습니다.
PEP 409: 예외 컨텍스트 억제¶
PEP 409는 체인된 예외 컨텍스트 표시를 비활성화할 수 있는 새로운 구문을 도입합니다. 이를 통해 예외 유형 간 변환이 발생하는 애플리케이션에서 더 깔끔한 오류 메시지를 얻을 수 있습니다:
>>> 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
원인(cause)을 억제하는 from None 접미사 없이, 원래 예외가 기본적으로 표시됩니다:
>>> 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
필요한 경우(예를 들어, 중간 라이브러리가 중요한 내부 세부 정보를 잘못 억제한 경우)에도 원래의 예외 컨텍스트가 남아 있으므로 디버깅 기능이 손실되지 않습니다:
>>> try:
... D({}).x
... except AttributeError as exc:
... print(repr(exc.__context__))
...
KeyError('x',)
더 보기
- PEP 409 - 예외 컨텍스트 억제하기
Ethan Furman이 작성하고; Ethan Furman 및 Nick Coghlan이 구현했습니다.
PEP 414: 명시적 유니코드 리터럴¶
유니코드 리터럴을 많이 사용하는 유니코드 인지 Python 애플리케이션의 Python 2로의 전환을 용이하게 하기 위해, Python 3.3은 다시 문자열 리터럴에 “u” 접두사를 지원합니다. 이 접두사는 Python 3에서 의미적 중요성을 갖지 않으며, 전적으로 개발자가 더 중요한 의미적 변경 사항(예: 바이너리 및 텍스트 데이터의 더 엄격한 기본 분리)에 집중할 수 있도록, 순수 기계적 변경을 줄이기 위해 제공되었습니다.
더 보기
- PEP 414 - 명시적 유니코드 리터럴
Armin Ronacher가 작성한 PEP.
PEP 3155: 클래스와 함수를 위한 정규화된 이름¶
함수와 클래스 객체는 모듈의 최상위 레벨에서 정의까지의 “경로”를 나타내는 새로운 __qualname__ 속성을 가집니다. 전역 함수 및 클래스의 경우, 이는 :attr:`~definition.__name__`과 같습니다. 다른 함수와 클래스의 경우, 실제 어디에 정의되었는지, 그리고 글로벌 스코프에서 어떻게 접근할 수 있는지에 대한 더 나은 정보를 제공합니다:
(바인딩되지 않은) 메서드를 사용한 예:
>>> class C:
... def meth(self):
... pass
...
>>> C.meth.__name__
'meth'
>>> C.meth.__qualname__
'C.meth'
중첩된 클래스를 사용한 예:
>>> 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'
중첩된 함수를 사용한 예:
>>> def outer():
... def inner():
... pass
... return inner
...
>>> outer().__name__
'inner'
>>> outer().__qualname__
'outer.<locals>.inner'
해당 객체들의 문자열 표현도 새롭고 더 정확한 정보를 포함하도록 변경됩니다:
>>> str(C.D)
"<class '__main__.C.D'>"
>>> str(C.D.meth)
'<function C.D.meth at 0x7f46b9fe31e0>'
더 보기
- PEP 3155 - 클래스와 함수를 위한 정규화된 이름
Antoine Pitrou가 작성하고 구현한 PEP.
PEP 412: 키 공유 딕셔너리¶
객체의 속성 저장을 위해 사용되는 딕셔너리는 이제 내부 저장소의 일부(즉, 키와 해당 해시를 저장하는 부분)를 서로 공유할 수 있게 되었습니다. 이는 많은 비내장 타입 인스턴스를 생성하는 프로그램의 메모리 소비를 줄입니다.
더 보기
- PEP 412 - 키 공유 딕셔너리
Mark Shannon이 작성하고 구현한 PEP.
PEP 362: 함수 시그니처 객체¶
새로운 함수 inspect.signature`는 파이썬 콜러블의 내부 검사를 쉽고 간단하게 합니다. 광범위한 범위의 콜러블이 지원됩니다: 재료(decorated) 여부와 관계없이 파이썬 함수, 클래스, 그리고 :func:`functools.partial() 객체입니다. 새로운 클래스인 inspect.Signature, inspect.Parameter 및 :class:`inspect.BoundArguments`는 어노테이션, 기본값, 매개변수 종류 및 바운드 인자 등 호출 시그니처에 대한 정보를 담고 있으며, 데코레이터 작성 및 호출 시그니처나 인자를 검증하거나 수정하는 모든 코드 작성을 크게 간소화합니다.
더 보기
- PEP 362: - 함수 Signature 객체
Brett Cannon, Yury Selivanov, Larry Hastings, Jiwon Seo가 작성하고 Yury Selivanov가 구현한 PEP
PEP 421: sys.implementation 추가하기¶
sys 모듈의 새로운 어트리뷰트는 현재 실행 중인 인터프리터 구현에 특정한 세부 정보를 노출합니다. sys.implementation 의 초기 어트리뷰트 집합에는 name, version, hexversion 및 cache_tag 가 포함되어 있습니다.
sys.implementation 의 목적은 표준 라이브러리가 사용하는 구현 특정 데이터를 하나의 이름 공간에 통합하는 것입니다. 이는 다른 파이썬 구현들이 단일한 표준 라이브러리 코드베이스를 훨씬 더 쉽게 공유할 수 있도록 합니다. 초기 상태에서 sys.implementation 는 구현 특정 데이터의 작은 부분을 담고 있습니다. 시간이 지남에 따라 그 비율은 표준 라이브러리를 더욱 이식하기 위해 조정될 것입니다.
One example of improved standard library portability is cache_tag. As of
Python 3.3, sys.implementation.cache_tag is used by importlib to
support PEP 3147 compliance. Any Python implementation that uses
importlib for its built-in import system may use cache_tag to control
the caching behavior for modules.
SimpleNamespace¶
sys.implementation 의 구현은 또한 파이썬에 새로운 타입을 도입합니다: types.SimpleNamespace. dict`와 같은 매핑 기반 이름 공간과 대조적으로, ``SimpleNamespace``는 :class:`object`처럼 속성 기반입니다. 하지만 ``object``와 달리, ``SimpleNamespace` 인스턴스는 쓰기가 가능합니다. 이는 일반적인 속성 접근을 통해 네임스페이스에 항목을 추가, 제거 및 수정할 수 있음을 의미합니다.
더 보기
- PEP 421 - sys.implementation 추가하기
Eric Snow가 작성하고 구현한 PEP
임포트의 구현체로서 importlib 사용¶
bpo-2377 - Replace __import__ w/ importlib.__import__
bpo-13959 - Re-implement parts of imp in pure Python
bpo-14605 - Make import machinery explicit
bpo-14646 - Require loaders set __loader__ and __package__
__import__() 함수는 이제 :func:`importlib.__import__`에 의해 구동됩니다. 이 작업은 :pep:`302`의 “2단계” 완료로 이어졌습니다. 이 변경 사항에는 여러 가지 이점이 있습니다. 첫째, 임포트를 구동하는 메커니즘 중 더 많은 부분이 암시적이거나 C 코드 내부에 숨겨져 있던 대신 노출되도록 허용했습니다. 둘째, Python 3.3을 지원하는 모든 파이썬 VM에서 사용할 단일 구현체를 제공하여 임포트 의미론의 VM별 편차를 종식하는 데 도움이 됩니다. 그리고 마지막으로, 임포트 유지 관리를 용이하게 하여 미래 성장을 할 수 있도록 합니다.
일반 사용자에게는 의미론에 가시적인 변화가 없어야 합니다. 현재 코드가 임포트를 조작하거나 프로그램 방식으로 임포트를 호출하는 사용자의 경우, 필요한 코드 변경 사항은 본 문서의 Porting Python code 섹션에서 다루고 있습니다.
새로운 API¶
이 작업의 큰 이점 중 하나는 import 구문이 작동하는 데 어떤 내용들이 포함되어 있는지 노출되었다는 것입니다. 이는 한때 암시적이던 다양한 임포터들이 이제 importlib 패키지의 일부로 완전히 노출되었음을 의미합니다.
importlib.abc`에서 정의된 추상 기본 클래스들은 각각 :term:`meta path finders 사이를 적절하게 구분하기 위해 importlib.abc.MetaPathFinder 및 importlib.abc.PathEntryFinder`를 도입함으로써 확장되었습니다. 이전의 ABC인 :class:!importlib.abc.Finder`는 이제 전방 호환성만을 위해 제공되며 메서드 요구 사항을 강제하지 않습니다.
파인더 관점에서 볼 때, :class:`importlib.machinery.FileFinder`는 모듈의 소스 및 바이트코드 파일을 검색하는 데 사용되는 메커니즘을 노출합니다. 이전에는 이 클래스가 :data:`sys.path_hooks`의 암묵적인 멤버였습니다.
로더 관점에서 볼 때, 새로운 추상 기반 클래스인 importlib.abc.FileLoader`는 파일 시스템을 모듈 코드에 대한 저장 메커니즘으로 사용하는 로더를 작성하는 데 도움을 줍니다. 소스 파일을 위한 로더 (:class:`importlib.machinery.SourceFileLoader), 소스 없는 바이트코드 파일을 위한 로더 (importlib.machinery.SourcelessFileLoader), 그리고 확장 모듈을 위한 로더 (importlib.machinery.ExtensionFileLoader)가 이제 직접 사용할 수 있습니다.
이제 ImportError`에는 관련 데이터를 제공할 때 설정되는 ``name` 및 path 어트리뷰트가 생겼습니다. 실패한 임포트에 대한 메시지는 이제 모듈 이름의 뒷부분만 표시하는 대신 전체 모듈 이름을 표시합니다.
importlib.invalidate_caches() 함수는 이제 :data:`sys.path_importer_cache`에 캐시된 모든 파인더에서 동일한 이름의 메서드를 호출하여 필요한 경우 저장된 상태를 정리하는 데 도움을 줍니다.
변경 사항 보기¶
코드를 변경해야 할 잠재적인 경우, Porting Python code 섹션을 참조하세요.
:mod:`importlib`이 이제 노출하는 범위를 넘어, 임포트에는 다른 가시적인 변경 사항들이 있습니다. 가장 큰 변화는 :data:`sys.meta_path`와 :data:`sys.path_hooks`가 이제 import에서 사용되는 모든 메타 경로 파인더와 경로 엔트리 후크를 저장한다는 것입니다. 이전에는 파인더들이 암묵적이었고 직접 노출되기보다는 import의 C 코드 내부에 숨겨져 있었습니다. 이는 이제 원하는 목적에 맞게 다양한 파인더의 순서를 제거하거나 변경할 수 있음을 의미합니다.
또 다른 변화는 모든 모듈이 __loader__ 어트리뷰트를 갖게 되어, 이 모듈을 생성하는 데 사용된 로더를 저장한다는 것입니다. :pep:`302`는 이 어트리뷰트를 로더가 구현하도록 의무화되도록 업데이트되어, 미래에는 서드파티 로더들이 업데이트되면 사람들이 이 어트리뷰트의 존재에 의존할 수 있을 것입니다. 하지만 그때까지는 import 시스템이 모듈을 로드 후에 설정합니다.
로더들 역시 PEP 366 에서 __package__ 어트리뷰트를 설정하도록 기대됩니다. 다시 한번 말하지만, import 자체는 이미 importlib 의 모든 로더에 이 값을 설정하고 있으며, import 자신이 로드 후에 이 어트리뷰트를 설정합니다.
sys.path_hooks`에서 어떤 파인더도 찾을 수 없을 때, :data:`sys.path_importer_cache`에는 이제 ``None``이 삽입됩니다. :class:!imp.NullImporter`가 더 이상 :data:`sys.path_hooks`에 직접 노출되지 않으므로, 발견된 파인더 없음의 값을 나타내는 용도로 항상 사용될 것이라고 의존할 수 없게 되었습니다.
나머지 모든 변경 사항들은 의미적 변화(semantic changes)와 관련되어 있으며, 파이썬 3.3용 코드를 업데이트할 때 고려해야 하므로 이 문서의 Porting Python code 섹션에서 읽어보는 것이 좋습니다.
(Brett Cannon 구현)
이외의 언어 변경 사항¶
핵심 파이썬 언어에 일부 작은 변경 사항들이 있습니다.
유니코드 이름 별칭과 명명된 시퀀스 지원이 추가되었습니다.
unicodedata.lookup`와 `()’N{…}’`` 모두 이제 이름 별칭을 해결하며, :func:`unicodedata.lookup`는 또한 명명된 시퀀스를 해결합니다.(Contributed by Ezio Melotti in bpo-12753.)
유니코드 데이터베이스가 UCD 버전 6.1.0으로 업데이트되었습니다.
range()객체에 대한 동등성 비교는 이제 해당 범위 객체가 생성하는 기본 시퀀스의 동등성을 반영하는 결과를 반환합니다. (bpo-13201)bytes및bytearray객체의count(),find(),rfind(),index(), 그리고rindex()메서드는 이제 첫 번째 인수로 0부터 255 사이의 정수를 받습니다.(Contributed by Petri Lehtinen in bpo-12170.)
The
rjust(),ljust(), andcenter()methods ofbytesandbytearraynow accept abytearrayfor thefillargument. (Contributed by Petri Lehtinen in bpo-12380.)list와bytearray에 새로운 메서드인copy()및clear()가 추가되었습니다 (bpo-10516). 결과적으로,MutableSequence도 이제clear()메서드를 정의합니다 (bpo-11388).Raw bytes literals는
rb"..."뿐만 아니라br"..."로 작성할 수 있게 되었습니다.(Antoine Pitrou 님이 bpo-13748 <에 기여함.)
:meth:`dict.setdefault`는 이제 주어진 키에 대해 한 번의 조회만 수행하므로, 내장된 타입과 함께 사용 시 원자적입니다.
(Filip Gruszczyński 님이 bpo-13521 <에 기여함.)
함수 호출이 함수 시그니처와 일치하지 않을 때 생성되는 에러 메시지가 크게 개선되었습니다.
(Benjamin Peterson 님이 기여함.)
더 세분화된 임포트 잠금¶
이전 버전의 CPython은 항상 전역 임포트 잠금에 의존했습니다. 이는 모듈을 가져오는 것이 다른 스레드에서 사이드 이펙트로 코드 실행을 트리거할 때와 같은 데드락과 같은 예상치 못한 불편함을 초래했습니다. 때로는 PyImport_ImportModuleNoBlock() C API 함수와 같은 서투른 임시 방편들이 사용되었습니다.
Python 3.3에서는 모듈 가져오기가 모듈별 잠금을 사용합니다. 이 방식은 여러 스레드에서 주어진 모듈을 가져오는 것을 올바르게 직렬화(불완전하게 초기화된 모듈의 노출 방지)하면서, 앞서 언급된 불편함을 제거합니다.
(Antoine Pitrou 님이 bpo-9260 <에 기여함.)
내장 함수와 타입들¶
open`에는 새로운 *opener* 매개변수가 추가되었습니다. 파일 객체의 기본 파일 디스크립터는 이제 *opener*(파일, 플래그)를 호출하여 얻을 수 있습니다. 이를 사용하여 예를 들어 :const:`os.O_CLOEXEC`와 같은 사용자 정의 플래그를 사용할 수 있습니다. `()’x’`` 모드가 추가되었습니다: 파일이 이미 존재하는 경우 실패하는 배타적 생성을 위한 열기입니다.:func:`print`에 flush 키워드 인수가 추가되었습니다. flush 키워드 인수가 True이면 스트림이 강제로 플러시됩니다.
hash(): 해시 난수화는 기본적으로 활성화되어 있으며,object.__hash__()및 :envvar:`PYTHONHASHSEED`를 참조하십시오.str타입에 새로운casefold()메서드가 추가되었습니다: 문자열의 케이스폴드를 복사본을 반환하며, 케이스폴드된 문자열은 대소문자 구분이 없는 매칭에 사용할 수 있습니다. 예를 들어,'ß'.casefold()는'ss'를 반환합니다.시퀀스 문서는 바이너리/텍스트 시퀀스 구분을 더 잘 설명하고 개별 내장 시퀀스 타입에 대한 특정 문서 섹션을 제공하도록 실질적으로 재작성되었습니다 (bpo-4966).
새로운 모듈들¶
faulthandler¶
이 새 디버그 모듈 faulthandler`는 Python 트레이스백을 명시적으로 덤프하는 함수를 포함합니다. 이는 오류(세그멘테이션 오류와 같은 충돌), 시간 초과 후 또는 사용자 시그널에 대해 발생할 수 있습니다. :const:`~signal.SIGSEGV, SIGFPE, SIGABRT, SIGBUS 및 SIGILL 시그널에 대한 오류 처리기를 설치하려면 faulthandler.enable`을 호출하십시오. 또한 :envvar:`PYTHONFAULTHANDLER() 환경 변수를 설정하거나 -X faulthandler 명령줄 옵션을 사용하여 시작 시에도 활성화할 수 있습니다.
Linux에서 세그멘테이션 오류의 예시:
$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault
Current thread 0x00007fb899f39700:
File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
File "<stdin>", line 1 in <module>
Segmentation fault
ipaddress¶
The new 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).
(Google과 Peter Moody 님이 PEP 3144 <에 기여함.)
lzma¶
The newly added lzma module provides data compression and decompression
using the LZMA algorithm, including support for the .xz and .lzma
file formats.
(Nadeem Vawda와 Per Øyvind Karlsen 님이 bpo-6715 <에 기여함.)
개선된 모듈들¶
abc¶
추상 메서드로 구성된 디스크립터를 포함하는 추상 기본 클래스 지원이 개선되었습니다. 추상 디스크립터를 선언하기 위한 권장 접근 방식은 이제 동적으로 업데이트되는 속성으로 :attr:`!__isabstractmethod__`를 제공하는 것입니다. 내장 디스크립터도 이에 맞게 업데이트되었습니다.
:deco:`abc.abstractproperty`는 더 이상 사용되지 않으므로, 대신 :deco:`abc.abstractmethod`와 함께 :deco:`property`를 사용하십시오.
:deco:`abc.abstractclassmethod`는 더 이상 사용되지 않으므로, 대신 :deco:`abc.abstractmethod`와 함께 :deco:`classmethod`를 사용하십시오.
:deco:`abc.abstractstaticmethod`는 더 이상 사용되지 않으므로, 대신 :deco:`abc.abstractmethod`와 함께 :deco:`staticmethod`를 사용하십시오.
(Darren Dale 님이 bpo-11610 <에 기여함.)
abc.ABCMeta.register`는 이제 등록된 서브클래스를 반환합니다. 이는 클래스 데코레이터로 사용될 수 있음을 의미합니다 (:issue:`10868()).
배열(array)¶
array 모듈은 q 및 Q 타입 코드를 사용하여 long long 타입을 지원합니다.
(Oren Tirosh와 Hirokazu Yamamoto가 bpo-1172711\에 기여함.)
base64¶
ASCII 전용 유니코드 문자열은 이제 base64 최신 인터페이스의 디코딩 함수에서 허용됩니다. 예를 들어, base64.b64decode('YWJj') 는 b'abc' 를 반환합니다. (Catalin Iacob가 bpo-13641 \에 기여함.)
binascii¶
기본적으로 인접한 바이트 객체 외에도, a2b_ 함수들은 이제 모두 ASCII 전용 문자열을 입력으로 허용합니다. (Antoine Pitrou가 bpo-13637\에 기여함.)
bz2¶
bz2 모듈은 처음부터 다시 작성되었습니다. 이 과정에서 여러 새로운 기능이 추가되었습니다:
새로운
bz2.open()함수: 바이너리 또는 텍스트 모드로 bzip2 압축 파일을 엽니다.:class:`bz2.BZ2File`은 이제 생성자의 fileobj 인수를 통해 임의의 파일 같은 객체로부터 읽고 쓸 수 있습니다.
(Nadeem Vawda가 bpo-5863\에 기여함.)
bz2.BZ2File`과 :func:`bz2.decompress`는 이제 다중 스트림 입력(예: :program:`pbzip2도구에서 생성된)을 압축 해제할 수 있습니다.bz2.BZ2File`은 또한 `’a’`` (추가) 모드를 사용하여 이러한 유형의 파일을 생성하는 데 사용될 수 있습니다.(Nir Aides가 bpo-1625\에 기여함.)
bz2.BZ2File`은 이제 :meth:!detach` 및truncate()메서드를 제외한 모든io.BufferedIOBaseAPI를 구현합니다.
codecs¶
mbcs 코덱은 모든 Windows 버전에서 replace 및 ignore 오류 핸들러를 올바르게 처리하도록 다시 작성되었습니다. 이제 mbcs 코덱은 인코딩에는 replace 만을 사용하는 대신, 모든 오류 핸들러를 지원하며 디코딩에는 ignore 가 사용됩니다.
Windows 전용 새 코덱이 추가되었습니다: cp65001 (bpo-13216 \). 이는 Windows 코드 페이지 65001 (Windows UTF-8, CP_UTF8)입니다. 예를 들어, 콘솔 출력 코드 페이지가 cp65001로 설정된 경우(예: chcp 65001 명령 사용), sys.stdout 에서 사용됩니다.
다중 바이트 CJK 디코더는 이제 더 빨리 재동기화합니다. 잘못된 바이트 시퀀스의 첫 번째 바이트만 무시합니다. 예를 들어, b'\xff\n'.decode('gb2312', 'replace') 은 이제 교체 문자를 포함하여 \n 를 반환합니다.
증분 CJK 코덱 인코더는 더 이상 encode() 메서드가 호출될 때마다 초기화되지 않습니다. 예를 들어:
>>> import codecs
>>> encoder = codecs.getincrementalencoder('hz')('strict')
>>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
b'~{NpJ)l6HK!#~} Bye.'
이 예시는 이전 Python 버전에서 b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.' 를 제공합니다.
unicode_internal 코덱은 사용 중단되었습니다.
컬렉션 모듈(collections)¶
ChainMap 클래스가 추가되어 여러 매핑을 단일 단위로 취급할 수 있게 되었습니다. (Raymond Hettinger가 bpo-11089\에 작성하고, bpo-11297\에서 공개함.)
추상 기본 클래스는 추상 및 구체적 컬렉션 클래스를 더 잘 구분하기 위해 새로운 collections.abc 모듈로 이동했습니다. 기존 임포트를 유지하기 위해 ABC에 대한 별칭은 여전히 collections 모듈에 존재합니다. (bpo-11085)
Counter 클래스는 이제 단항 + 및 - 연산자뿐만 아니라, 인플레이스 연산자인 +=, -=, |=, 및 &= 도 지원합니다. (Raymond Hettinger가 bpo-13121 \에 기여함.)
contextlib¶
nested` API(사용 중단되어 제거됨)와 달리, 새로운 API는 컨텍스트 관리자가 자원을 __init__ 메서드에서 습득하는지(예: 파일 객체) 또는 __enter__ 메서드에서 습득하는지(예: threading 모듈의 동기화 객체)에 관계없이 올바르게 작동하도록 설계되었습니다.
crypt¶
솔트 및 모듈러 암호 형식(해싱 방법)과 mksalt() 함수가 crypt 모듈에 추가되었습니다.
curses¶
curses모듈이 ncursesw 라이브러리와 연결된 경우, 유니코드 문자열 또는 문자가 전달될 때는 유니코드 함수(예:waddwstr())를 사용하고, 그렇지 않을 때는 바이트 함수(예:waddstr())를 사용하십시오.유니코드 문자열 인코딩 시
utf-8대신 로케일 인코딩을 사용하십시오.curses.window`에 새로운 :attr:`curses.window.encoding속성이 추가되었습니다.curses.window클래스에는 와이드 문자를 가져오는 새get_wch()메서드가 있습니다.curses모듈은 와이드 문자를 푸시하여 다음unget_wch()함수를 가지고 있습니다.
(Iñigo Serna 님이 bpo-6755 에서 기여했습니다.)
datetime¶
이제 나이브와 어웨어
datetime인스턴스 간의 동등 비교는TypeError\를 발생시키는 대신False`를 반환합니다 (:issue:`15006).새
datetime.datetime.timestamp()메서드:datetime인스턴스에 해당하는 POSIX 타임스탬프를 반환합니다.datetime.datetime.strftime()메서드는 1000년보다 오래된 연도를 형식화할 수 있습니다.datetime.datetime.astimezone()메서드는 인자 없이 호출되어 datetime 인스턴스를 시스템 시간대로 변환할 수 있습니다.
decimal¶
- bpo-7652 - 빠른 네이티브 십진 산술 통합.
C-모듈과 libmpdec는 Stefan Krah가 작성했습니다.
새 C 버전의 decimal 모듈은 임의 정밀도로 올바르게 반올림된 십진 부동 소수점 산술을 위해 고속 라이브러리 libmpdec를 통합합니다. libmpdec는 IBM의 일반 십진 산술 사양을 준수합니다.
성능 향상 폭은 데이터베이스 애플리케이션의 경우 10배에서 수치적으로 집약적인 애플리케이션의 경우 최대 100배에 달합니다. 이 숫자는 십진 부동 소수점 산술에 사용되는 표준 정밀도에 대한 기대 성능 향상치입니다. 정밀도는 사용자 구성이 가능하므로 정확한 수치는 다를 수 있습니다. 예를 들어, 정수 bignum 산술에서는 차이가 훨씬 더 클 수 있습니다.
다음 표는 설명을 위한 것입니다. 벤치마크는 https://www.bytereef.org/mpdecimal/quickstart.html 에서 확인할 수 있습니다.
decimal.py
_decimal
속도 향상
파이
42.02초
0.345초
120배
통신
172.19초
5.68초
30배
psycopg
3.57초
0.29초
12배
기능 (Features)¶
FloatOperation신호는 float와 Decimal을 혼합하는 데 더 엄격한 의미를 선택적으로 활성화합니다.Python이 스레드 없이 컴파일된 경우, C 버전은 비용이 많이 드는 스레드 로컬 컨텍스트 매커니즘을 자동으로 비활성화합니다. 이 경우
HAVE_THREADS변수는False로 설정됩니다.
API 변경 사항¶
C 모듈에는 머신 아키텍처에 따라 다음과 같은 컨텍스트 제한이 있습니다:
컨텍스트 템플릿 (
DefaultContext,BasicContext및ExtendedContext)에서Emax와Emin의 크기는999999로 변경되었습니다.decimal.py의
Decimal생성자는 컨텍스트 제한을 관찰하지 않으며 임의 지수 또는 정밀도로 값을 정확하게 변환합니다. C 버전에는 내부 제한이 있으므로 다음 방식이 사용됩니다: 가능한 경우, 값은 정확하게 변환되며 그렇지 않으면 :exc:`~decimal.InvalidOperation`가 발생하고 결과는 NaN이 됩니다. 후자의 경우, 반올림되거나 부정확한 값을 얻기 위해 항상 :meth:`~decimal.Context.create_decimal`를 사용할 수 있습니다.decimal.py의 거듭제곱 함수는 항상 올바르게 반올림됩니다. C 버전에서는
exp()및ln()함수의 올바르게 반올림된 값으로 정의되지만, 최종 결과는 “거의 항상 올바르게 반올림”됩니다.C 버전에서 신호를 포함하는 컨텍스트 딕셔너리는 :class:`~collections.abc.MutableMapping`입니다. 속도상의 이유로, :attr:`~decimal.Context.flags`와 :attr:`~decimal.Context.traps`는 항상 컨텍스트가 초기화된 것과 같은 :class:`~collections.abc.MutableMapping`을 참조합니다. 새로운 신호 딕셔너리가 할당되면, :attr:`~decimal.Context.flags`와 :attr:`~decimal.Context.traps`가 새 값으로 업데이트되지만, 오른쪽 핸드사이드(RHS) 딕셔너리를 참조하지는 않습니다.
:class:`~decimal.Context`를 Pickle하면 Python 버전과 C 버전 모두에서 공통의 교환 형식을 가지기 위해 다른 출력을 생성합니다.
quantize()메서드의 watchexp 매개변수는 구식입니다.
email¶
정책 객체¶
The email package now has a policy framework. A
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 Compat32 policy, which provides backward
compatibility with the email package in Python 3.2. A policy can be
specified when an email message is parsed by a parser, or when a
Message object is created, or when an email is
serialized using a generator. Unless overridden, a policy passed
to a parser is inherited by all the Message object and sub-objects
created by the parser. By default a generator will use the policy of
the Message object it is serializing. The default policy is
compat32.
모든 policy 가 구현하는 최소한의 제어 기능은 다음과 같습니다:
max_line_length |
직렬화될 때 |
linesep |
|
cte_type |
|
raise_on_defect |
|
policy 객체의 clone() 메서드를 사용하여 새 설정을 가진 새로운 policy 인스턴스가 생성됩니다. clone``은 상기 제어 기능 중 어느 것을 키워드 인수(keyword arguments)로든 받을 수 있습니다. 호출에서 지정되지 않은 어떤 제어 기능도 기본값을 유지합니다. 따라서 다음과 같이 ``\r\n linesep 문자를 사용하는 정책을 만들 수 있습니다:
mypolicy = compat32.clone(linesep='\r\n')
정책은 애플리케이션에서 필요한 형식으로 메시지 생성을 더 간단하게 만들 수 있습니다. generator 를 호출하는 모든 위치에 linesep=’\r\n’ 을 지정해야 하는 대신, parser 또는 Message 가 Message 객체를 생성할 때 사용되는 정책을 설정할 때 한 번만 이를 지정할 수 있습니다. 반면에 여러 형식으로 메시지를 생성해야 한다면, 적절한 generator 호출에 여전히 매개변수를 지정할 수 있습니다. 혹은 다양한 경우의 사용자 정의 policy 인스턴스를 가지고 있어 generator 를 생성할 때 전달할 수도 있습니다.
새로운 헤더 API가 포함된 잠정 정책¶
정책 프레임워크 자체만으로도 가치가 있지만, 이것을 도입한 주된 동기는 새로운 정책을 만들어 이메일 패키지에 새로운 기능을 구현할 수 있도록 하며, 기존의 정책을 사용하지 않는 사용자들에게 하위 호환성을 유지하는 것입니다. 새로운 정책들이 새로운 API를 도입하기 때문에, 저희는 이를 Python 3.3에서 :term:`provisional policy <provisional package>`로 배포하고 있습니다. 핵심 개발자들이 필요하다고 판단할 경우, 하위 호환되지 않는 변경 사항(코드 제거를 포함하여)이 발생할 수 있습니다.
새로운 정책들은 :class:`~email.policy.EmailPolicy`의 인스턴스이며, 다음 추가 제어 기능들을 추가합니다:
refold_source |
|
header_factory |
header_factory``는 새 정책에서 제공하는 주요 기능입니다. 새로운 정책이 사용되면, ``Message 객체에서 검색된 모든 헤더는 header_factory``가 생성한 객체이며, ``Message``에 헤더를 설정할 때마다 ``header_factory``가 생성한 객체가 됩니다. 이 모든 헤더 객체에는 그 헤더 이름을 나타내는 ``name 속성이 있습니다. 주소 및 날짜 헤더는 해당 헤더의 파싱된 데이터에 접근할 수 있는 추가 속성을 가집니다. 즉, 이제 다음과 같은 작업을 수행할 수 있습니다:
>>> 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
유니코드 표시 이름이 메시지가 직렬화될 때 utf-8 로 자동 인코딩된다는 점은 알 수 있지만, 헤더에 직접 접근할 때는 유니코드 버전을 얻게 됩니다. 이는 email.header 의 decode_header() 나 make_header() 함수를 다룰 필요성을 없애줍니다.
parts에서 주소도 생성할 수 있습니다:
>>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
... Address('Sally', 'sally', 'example.com')]),
... Address('Bonzo', addr_spec='bonz@laugh.com')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <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>
유니코드로의 디코딩은 자동으로 수행됩니다:
>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <foo@example.com>'
메시지를 파싱할 때, 헤더 객체의 addresses 및 groups 속성을 사용하여 그룹과 개별 주소에 접근할 수 있습니다:
>>> 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'),))
요약하자면, 새로운 정책 중 하나를 사용하면 헤더 조작이 올바르게 작동합니다. 즉, 애플리케이션은 유니코드 문자열로 작업하고, 이메일 패키지는 RFC 표준 내용 전송 인코딩(Content Transfer Encodings)에 따라 유니코드를 투명하게 인코딩 및 디코딩합니다.
다른 API 변경 사항¶
새로운 parser 모듈에 추가되어 :class:`~email.parser.HeaderParser`를 보완하고 Bytes API를 완성합니다.
새로운 유틸리티 함수:
format_datetime(): :class:`~datetime.datetime`을 받아 이메일 헤더에 사용되는 형식의 문자열을 생성합니다.parsedate_to_datetime(): 이메일 헤더에서 날짜 문자열을 받아, 인식 가능한datetime`으로 변환하거나, 오프셋이 `-0000``인 경우 인식하지 않는 :class:`~datetime.datetime`으로 변환합니다.localtime(): 인수가 없으면 로컬 :class:`~datetime.timezone`을 사용하여 현재 로컬 시간을 인식 가능한 :class:`~datetime.datetime`으로 반환합니다. 인식 가능한 :class:`~datetime.datetime`이 주어지면, 로컬 :class:`~datetime.timezone`을 사용하여 이를 인식 가능한 :class:`~datetime.datetime`으로 변환합니다.
ftplib¶
ftplib.FTP는 이제source_address키워드 인수를 받아 아웃고잉 소켓을 생성할 때 사용할 소스 주소의(host, port)를 지정합니다. (도움재 제공자: Giampaolo Rodolà in bpo-8594.)FTP_TLS클래스는 이제 제어 채널을 일반 텍스트로 되돌리는 새로운ccc()함수를 제공합니다. 이는 고정 포트를 열지 않고 비보안 FTP로 NAT을 처리하는 방법을 아는 방화벽의 이점을 활용하는 데 유용할 수 있습니다. (도움재 제공자: Giampaolo Rodolà in bpo-12139.)파싱 가능한 디렉터리 목록 형식을 제공하는
ftplib.FTP.mlsd()메서드를 추가하고,ftplib.FTP.nlst`와 :meth:`ftplib.FTP.dir()사용을 폐기했습니다. (도움재 제공자: Giampaolo Rodolà in bpo-11072.)
functools¶
@functools.lru_cache 데코레이터가 이제 typed 키워드 인수를 받아(기본값이 False 로 설정되어 비교 가능한 다른 자료형의 값을 별도의 캐시 슬롯에 저장하도록 보장합니다. (도움재 제공자: Raymond Hettinger in bpo-13227.)
gc¶
새로운 callbacks 목록을 사용하여 가비지 컬렉터에 의해 수집 전후 호출되는 콜백을 등록할 수 있게 되었습니다.
hmac¶
시간 분석을 통한 다이제스트에 대한 측면 채널 공격을 방지하기 위해 새로운 compare_digest() 함수가 추가되었습니다. (도움재 제공자: Nick Coghlan 및 Christian Heimes in bpo-15061.)
http¶
http.server.BaseHTTPRequestHandler`는 이제 :meth:`~http.server.BaseHTTPRequestHandler.end_headers`가 호출될 때 헤더를 버퍼링하여 한 번에 모두 작성합니다. 새 메서드인 :meth:`~http.server.BaseHTTPRequestHandler.flush_headers`를 사용하여 누적된 헤더를 언제 전송할지 직접 관리할 수 있습니다. (도움재 제공자: Andrew Schaaf in :issue:`3709.)
http.server`는 이제 유효한 ``HTML 4.01 strict` 출력을 생성합니다. (도움재 제공자: Ezio Melotti in bpo-13295.)
http.client.HTTPResponse`에는 이제 :meth:`~http.client.HTTPResponse.readinto 메서드가 추가되어 io.RawIOBase 클래스로 사용될 수 있습니다. (Contributed by John Kuhn in bpo-13464.)
HTML¶
html.parser.HTMLParser is now able to parse broken markup without
raising errors, therefore the strict argument of the constructor and the
HTMLParseError exception are now deprecated.
The ability to parse broken markup is the result of a number of bug fixes that
are also available on the latest bug fix releases of Python 2.7/3.2.
(Contributed by Ezio Melotti in bpo-15114, and bpo-14538,
bpo-13993, bpo-13960, bpo-13358, bpo-1745761,
bpo-755670, bpo-13357, bpo-12629, bpo-1200313,
bpo-670664, bpo-13273, bpo-12888, bpo-7311.)
html.entities 모듈에 HTML5 이름 문자 참조를 해당 유니코드 문자로 매핑하는 새로운 html5 사전이 추가되었습니다. 이 사전을 이제 (Contributed by Ezio Melotti in :issue:`11113 및 bpo-15156.)
imaplib¶
IMAP4_SSL 생성자는 보안 채널의 매개변수를 제어하는 SSLContext 인자를 이제 허용합니다.
(Contributed by Sijin Joseph in bpo-8808.)
inspect¶
새로운 getclosurevars() 함수가 추가되었습니다. 이 함수는 함수의 본문에서 참조되는 모든 이름들의 현재 바인딩과 해당 이름들이 결정된 위치를 보고하여, 상태 저장 클로저에 의존하는 코드를 테스트할 때 정확한 내부 상태를 확인하기 쉽게 만듭니다.
(Contributed by Meador Inge 및 Nick Coghlan in bpo-13062.)
새로운 getgeneratorlocals() 함수가 추가되었습니다. 이 함수는 제너레이터의 스택 프레임에 있는 지역 변수들의 현재 바인딩을 보고하여, 제너레이터를 테스트할 때 정확한 내부 상태를 확인하기 쉽게 만듭니다.
(Contributed by Meador Inge in bpo-15153.)
io¶
open() 함수에는 파일을 독점적으로 새 파일로 생성하고 파일이 이미 존재하는 경우 FileExistsError`를 발생시킬 수 있는 새로운 `’x’`` 모드가 있습니다. 이는 C11의 fopen()의 ‘x’ 모드를 기반으로 합니다.
(Contributed by David Townshend in bpo-12760.)
The constructor of the TextIOWrapper class has a new
write_through optional argument. If write_through is True, calls to
write() are guaranteed not to be buffered: any data
written on the TextIOWrapper object is immediately handled to its
underlying binary buffer.
itertools¶
accumulate`는 이제 사용자 정의 바이너리 함수를 제공하기 위한 선택적 ``func`() 인자를 받습니다.
logging 모듈¶
basicConfig() 함수는 이제 루트 로거에 추가할 핸들러들의 이터러블을 받는 선택적 handlers 인자를 지원합니다.
SysLogHandler`에 클래스 수준 속성 :attr:!append_nul`이 추가되어, syslog 레코드에 NUL (000) 바이트를 추가할지 여부를 제어할 수 있게 되었습니다. 이는 일부 데몬에서는 필요하지만 다른 경우 로그로 전달되기 때문에 이 기능이 유용합니다.
math¶
math 모듈에는 x 의 밑이 2인 로그를 반환하는 새로운 함수, log2() 가 추가되었습니다.
(Written by Mark Dickinson in bpo-11888.)
mmap¶
read() 메서드는 이제 다른 파일 같은 객체와 더 호환됩니다: 인자를 생략하거나 None 으로 지정하면, 현재 파일 위치부터 매핑 끝까지의 바이트를 반환합니다. (Contributed by Petri Lehtinen in bpo-12021.)
multiprocessing 모듈¶
새로운 multiprocessing.connection.wait() 함수는 타임아웃을 사용하여 여러 객체(연결, 소켓 및 파이프 등)를 폴링할 수 있게 합니다. (Contributed by Richard Oudkerk in bpo-12328.)
multiprocessing.connection.Connection 객체는 이제 프로세싱 간 연결을 통해 전송될 수 있습니다. (Contributed by Richard Oudkerk in bpo-4892.)
multiprocessing.Process`는 더 이상 다음과 같은 키워드 인자를 받아 기본 동작을 재정의할 수 있습니다. 부모 프로세스로부터 `daemon 플래그를 상속받는 기존 동작입니다 (bpo-6064\를 참조하십시오).
sentinel 속성은 적절한 OS 프리미티브(예: posix 시스템에서 select)를 사용하여 한 번에 여러 개의 Process 객체에서 대기할 수 있게 합니다.
새로운 메서드들인 multiprocessing.pool.Pool.starmap`과 :meth:`~multiprocessing.pool.Pool.starmap_async`는 기존의 :meth:`multiprocessing.pool.Pool.map() 및 map_async() 함수에 대한 :func:`itertools.starmap`과 같은 기능을 제공합니다. (Hynek Schlawack가 :issue:`12708`에서 기여했습니다.)
nntplib¶
nntplib.NNTP 클래스는 이제 컨텍스트 관리 프로토콜을 지원하여, socket.error 예외를 무조건적으로 처리하고 작업이 완료되면 NNTP 연결을 닫을 수 있습니다:
>>> 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')
>>>
(Giampaolo Rodolà가 :issue:`9795`에서 기여했습니다.)
os¶
os모듈에는 새로운pipe2()함수가 추가되어, :const:`~os.O_CLOEXEC 또는 :const:`~os.O_NONBLOCK 플래그를 원자적으로 설정하여 파이프를 생성할 수 있습니다. 이는 특히 멀티스레드 프로그램에서 경쟁 상태(race conditions)를 피하는 데 유용합니다.os모듈에는 데이터를 한 파일(또는 소켓) 기술자에서 다른 파일(또는 소켓) 기술자로 복사하는 효율적인 “제로-카피” 방식을 제공하는 새로운sendfile()함수가 있습니다. “제로-카피”라는 문구는 두 기술자 간의 모든 데이터 복사가 커널에 의해 완전히 수행되며, 사용자 공간 버퍼로 데이터를 복사하지 않는다는 사실을 의미합니다. 예를 들어 파일 다운로드와 같이 디스크의 파일을 네트워크 소켓으로 효율적으로 복사하는 데 :func:`~os.sendfile`를 사용할 수 있습니다.(Ross Lagerwall과 Giampaolo Rodolà가 :issue:`10882`에서 제출한 패치입니다.)
심볼릭 링크 공격이나 임시 파일 및 디렉토리 관련 문제와 같은 경쟁 상태를 피하려면, 파일 이름 대신 파일 기술자를 조작하는 것이 더 신뢰할 수 있으며 (또한) 빠릅니다. Python 3.3에서는 기존 함수들을 개선하고 파일 기술자로 작업하기 위한 새로운 함수들을 소개했습니다 (bpo-4761, bpo-10755 및 bpo-14626)
os모듈에는 기존의fwalk()함수가 있습니다. 이는 특히 심볼릭 링크 경쟁 상태를 피하는 데 유용합니다.다음 함수들은 경로 인수에 대해 선택적 dir_fd (디렉터리 기술자를 참조한 상대 경로) 및/또는 follow_symlinks (심볼릭 링크를 따르지 않기) 를 지원합니다:
access(),chflags(),chmod(),chown(),link(),lstat(),mkdir(),mkfifo(),mknod(),open(),readlink(),remove(),rename(),replace(),rmdir(),stat(),symlink(),unlink(),utime(). 이러한 매개변수의 플랫폼 지원 여부는os.supports_dir_fd`와 :data:`os.supports_follow_symlinks설정에서 확인할 수 있습니다.다음 함수들은 경로 인수에 파일 기술자를 지원합니다:
chdir(),chmod(),chown(),execve(),listdir(),pathconf(),exists(),stat(),statvfs(),utime(). 이러한 기능의 플랫폼 지원 여부는os.supports_fd설정에서 확인할 수 있습니다.
access`는 접근 확인 시 실제(real) uid/gid 대신 유효한(effective) uid/gid를 사용하도록 하는 ``effective_ids`()키워드 인자를 받습니다. 이러한 기능의 플랫폼 지원 여부는supports_effective_ids설정에서 확인할 수 있습니다.os모듈에는 두 가지 새로운 함수가 추가되었습니다:setpriority(). 이들은 프로세스의 niceness/우선순위를 가져오거나 설정할 수 있으며, 현재 프로세스에만 국한되는 것이 아니라 모든 프로세스로 확장되어 :func:`os.nice`와 유사하게 사용됩니다.(Giampaolo Rodolà가 :issue:`10784`에서 제출한 패치입니다.)
새로운
os.replace()함수를 사용하면 대상 파일을 덮어쓰면서 크로스 플랫폼으로 파일 이름을 바꿀 수 있습니다.os.rename`을 사용하면 POSIX 하에서는 기존 대상 파일을 덮어쓰지만, Windows에서는 오류를 발생시킵니다. (Antoine Pitrou가 :issue:`8828()\에서 기여했습니다.)stat 계열 함수들(
stat(),fstat(), 및lstat())은 이제 나노초 정밀도로 파일의 타임스탬프를 읽을 수 있습니다. 대칭적으로,(Larry Hastings가 :issue:`14127()\에서 기여했습니다.)새로운
os.get_terminal_size()함수는 파일 디스크립터에 연결된 터미널의 크기를 조회합니다. 또한shutil.get_terminal_size`도 참조하십시오. (Zbigniew Jędrzejewski-Szmek가 :issue:`13609()\에서 기여했습니다.)
리눅스 확장 속성을 지원하는 새로운 함수들(bpo-12720):
getxattr(),listxattr(),removexattr(),setxattr().스케줄러에 대한 새로운 인터페이스입니다. 이 함수들은 운영 체제가 프로세스에 CPU 시간 할당하는 방법을 제어합니다. 새로운 함수:
sched_get_priority_max(),sched_get_priority_min(),sched_getaffinity(),sched_getparam(),sched_getscheduler(),sched_rr_get_interval(),sched_setaffinity(),sched_setparam(),sched_setscheduler(),sched_yield(),파일 시스템을 제어하는 새로운 함수들:
posix_fadvise(): 특정 패턴으로 데이터에 액세스하려는 의도를 알려 커널이 최적화를 할 수 있도록 합니다.posix_fallocate(): 파일에 충분한 디스크 공간이 할당되도록 보장합니다.sync(): 모든 것을 디스크에 쓰도록 강제합니다.
추가적인 새로운 posix 함수들:
lockf(): 열린 파일 기술자에 POSIX 록을 적용, 테스트 또는 제거합니다.pread(): 오프셋에서 파일 기술자로부터 읽습니다. 이때 파일 오프셋은 변경되지 않습니다.pwrite(): 오프셋으로부터 파일 기술자로 씁니다. 이때 파일 오프셋은 변경되지 않습니다.readv(): 파일 디스크립터에서 여러 쓸 수 있는 버퍼로 읽습니다.truncate(): path*에 해당하는 파일을 최대 *length 바이트 크기가 되도록 자릅니다.waitid(): 하나 이상의 자식 프로세스 완료를 기다립니다.writev(): buffers 의 내용을 파일 기술자로 씁니다. 여기서 buffers 는 임의의 버퍼 시퀀스입니다.getgrouplist()(bpo-9344): 지정된 사용자가 속한 그룹 ID 목록을 반환합니다.
uname(): 반환형이 튜플에서 이름 붙은 어트리뷰트를 가진 유사 튜플 객체로 변경되었습니다.Some platforms now support additional constants for the
lseek()function, such asos.SEEK_HOLEandos.SEEK_DATA.새로운 상수
RTLD_LAZY,RTLD_NOW,RTLD_GLOBAL,RTLD_LOCAL,RTLD_NODELETE,RTLD_NOLOAD, 및setdlopenflags함수와 함께 사용되며,ctypes및DLFCN`에 정의된 유사한 상수들을 대체합니다. (Victor Stinner가 :issue:`13226\에서 기여했습니다.)os.symlink`은 이제 크로스 플랫폼 지원을 용이하게 하기 위해 비-Windows 플랫폼에서 ``target_is_directory`()키워드 인수를 받으며 (무시합니다).
pdb¶
이제 탭-완성은 명령 이름뿐만 아니라 그 인자에도 사용할 수 있습니다. 예를 들어, break 와 같은 명령어의 경우 함수 및 파일 이름이 자동 완성됩니다.
(Georg Brandl가 bpo-14210\에서 기여했습니다.)
pickle¶
pickle.Pickler 객체는 이제 선택적인 dispatch_table 속성을 가지고 있어, 개별 피클러에 대한 축소 함수를 설정할 수 있습니다.
(Richard Oudkerk가 bpo-14166\에서 기여했습니다.)
pydoc¶
Tk GUI와 serve() 함수가 pydoc 모듈에서 제거되었습니다: pydoc -g 및 :func:`!serve`는 Python 3.2에서 사용 중단(deprecated)되었습니다.
re¶
str`의 정규 표현식은 이제 `u`` 및 \U 이스케이프를 지원합니다.
(Serhiy Storchaka가 bpo-3665\에서 기여했습니다.)
sched¶
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 theschedulerin non-blocking applications. (Contributed by Giampaolo Rodolà in bpo-13449.)schedulerclass can now be safely used in multi-threaded environments. (Contributed by Josiah Carlson and Giampaolo Rodolà in bpo-8684.)timefunc and delayfunct parameters of
schedulerclass constructor are now optional and defaults totime.time()andtime.sleep()respectively. (Contributed by Chris Clark in bpo-13245.)enter()andenterabs()argument parameter is now optional. (Contributed by Chris Clark in bpo-13245.)enter()andenterabs()now accept a kwargs parameter. (Contributed by Chris Clark in bpo-13245.)
선택¶
Solaris and derivative platforms have a new class select.devpoll
for high performance asynchronous sockets via /dev/poll.
(Contributed by Jesús Cea Avión in bpo-6397.)
shlex¶
이전에 문서화되지 않았던 pipes 모듈의 헬퍼 함수 quote 가 shlex 모듈로 이동되었고 문서화되었습니다. quote() 는 셸에 의해 특별한 의미를 가질 수 있는 문자열의 모든 문자를 올바르게 이스케이프합니다.
shutil¶
새로운 함수:
disk_usage(): provides total, used and free disk space statistics. (Contributed by Giampaolo Rodolà in bpo-12442.)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.)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.)
copy2()andcopystat()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 and bpo-15238.)Several functions now take an optional
symlinksargument: 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.)When copying files to a different file system,
move()now handles symlinks the way the posixmvcommand does, recreating the symlink rather than copying the target file contents. (Contributed by Jonathan Niehof in bpo-9993.)move()now also returns thedstargument as its result.rmtree()is now resistant to symlink attacks on platforms which support the newdir_fdparameter inos.open()andos.unlink(). (Contributed by Martin von Löwis and Hynek Schlawack in bpo-4489.)
signal¶
signal모듈은 다음 함수들을 가지고 있습니다:pthread_sigmask(): fetch and/or change the signal mask of the calling thread (Contributed by Jean-Paul Calderone in bpo-8407);pthread_kill(): 스레드에 시그널을 전송합니다;sigpending(): 보류 중인 함수들을 검사합니다;sigwait(): 시그널을 기다립니다;sigwaitinfo(): 시그널을 기다리면서, 그에 대한 자세한 정보를 반환합니다;sigtimedwait(): :func:`~signal.sigwaitinfo`와 같지만 타임아웃이 있습니다.
시그널 핸들러는 웨이크업 파일 기술자에 널 바이트 대신 단일 바이트로 시그널 번호를 기록합니다. 따라서 여러 시그널을 기다리고 어떤 시그널이 발생했는지 알 수 있습니다.
signal.signal()및 :func:`signal.siginterrupt`는 RuntimeError 대신 OSError를 발생시킵니다: OSError는 errno 속성을 가집니다.
smtpd¶
smtpd 모듈은 이제 RFC 5321 (확장 SMTP) 및 RFC 1870 (크기 확장)을 지원합니다. 표준에 따라, 이러한 확장은 클라이언트가 EHLO 명령으로 세션을 시작하는 경우에만 활성화됩니다.
(Alberto Trevino의 초기 ELHO 지원. Juhana Jauhiainen이 크기 확장 담당. Michele Orrù와 Dan Boswell이 패치에 상당한 추가 작업을 기여했습니다. bpo-8739)
smtplib¶
The SMTP, SMTP_SSL, and
LMTP classes now accept a source_address keyword argument
to specify the (host, port) to use as the source address in the bind call
when creating the outgoing socket. (Contributed by Paulo Scardine in
bpo-11281.)
SMTP`는 이제 컨텍스트 관리 프로토콜을 지원하여, ``with` 문에서 SMTP 인스턴스를 사용할 수 있습니다. (Giampaolo Rodolà가 :issue:`11289`에 기여함.)
SMTP_SSL 생성자와 starttls() 메서드는 이제 보안 채널의 매개변수를 제어하는 SSLContext 매개변수를 받습니다. (Kasun Herath가 :issue:`8809`에 기여함.)
socket¶
socket클래스는 이제 하부 플랫폼에서 지원하는 경우 보조 데이터 처리를 위해 추가적인 메서드를 노출합니다:(David Watson이 :issue:`6560`에 기여했으며, Heiko Wundram의 이전 패치를 기반으로 함)
socket클래스는 이제 Linux (https://lwn.net/Articles/253425)에서 PF_CAN 프로토콜 패밀리(https://en.wikipedia.org/wiki/Socketcan)를 지원합니다.(Matthias Fuchs가 기여하고 Tiago Gonçalves가 :issue:`10141`에 업데이트함.)
socket클래스는 이제 PF_RDS 프로토콜 패밀리 (https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets 및 https://oss.oracle.com/projects/rds)을 지원합니다.socket클래스는 이제 OS X에서PF_SYSTEM프로토콜 패밀리를 지원합니다. (Michael Goderbauer가 :issue:`13777`에 기여함.)새 함수 :func:`~socket.sethostname`을 사용하면 호출 프로세스가 충분한 권한을 가진 경우 유닉스 시스템에서 호스트 이름을 설정할 수 있습니다. (Ross Lagerwall가 :issue:`10866`에 기여함.)
socketserver¶
serve_forever 메서드에 의해 호출되는 오버라이더(overridable) 메서드인 :meth:`~socketserver.BaseServer.service_actions`를 가집니다. :class:`~socketserver.ForkingMixIn`은 자식 좀비 프로세스를 정리하는 데 이를 사용합니다. (Justin Warkentin이 :issue:`11109`에 기여함.)
sqlite3¶
새로운 sqlite3.Connection 메서드 :meth:`~sqlite3.Connection.set_trace_callback`은 sqlite에서 처리되는 모든 sql 명령의 추적을 캡처하는 데 사용할 수 있습니다. (Torsten Landschoff가 :issue:`11688`에 기여함.)
ssl¶
ssl모듈은 두 가지 새로운 난수 생성 함수를 가지고 있습니다:RAND_bytes(): 암호학적으로 강력한 의사 난수 바이트를 생성합니다.RAND_pseudo_bytes(): 의사 난수 바이트를 생성합니다.
(Victor Stinner가 :issue:`12049`에 기여함.)
ssl모듈은 다양한 종류의 오류를 검사하기 쉽도록 더 세분화된 예외 계층을 노출합니다. (Antoine Pitrou가 :issue:`11183`에 기여함.):meth:`~ssl.SSLContext.load_cert_chain`은 이제 개인 키가 암호화된 경우 사용되는 password 인자를 받습니다. (Adam Simpkins가 :issue:`12803`에 기여함.)
Diffie-Hellman 키 교환은 일반 방식과 타원 곡선 기반 방식 모두
load_dh_params()및set_ecdh_curve()메서드를 통해 지원됩니다. (Antoine Pitrou가 bpo-13626 및 :issue:`13627`에 기여함.)SSL 소켓은 SCRAM-SHA-1-PLUS와 같은 특정 인증 메커니즘 구현을 가능하게 하는 새로운
get_channel_binding()메서드를 가집니다. (Jacek Konieczny가 :issue:`12551`에 기여함.)compression()메서드를 통해 SSL 소켓이 사용하는 압축 알고리즘을 조회할 수 있습니다. 새로 추가된 속성 :const:`~ssl.OP_NO_COMPRESSION`은 압축 기능을 비활성화하는 데 사용할 수 있습니다. (Antoine Pitrou가 :issue:`13634`에서 기여했습니다.)ssl.SSLContext.set_npn_protocols()메서드를 사용하여 Next Protocol Negotiation 확장에 대한 지원이 추가되었습니다. (Colin Marc가 :issue:`14204`에서 기여했습니다.)이제
library및reason속성 덕분에 SSL 오류를 더 쉽게 조사할 수 있습니다. (Antoine Pitrou가 :issue:`14837`에서 기여했습니다.)get_server_certificate()함수가 IPv6을 지원하도록 변경되었습니다. (Charles-François Natali가 :issue:`11811`에서 기여했습니다.)새로운 속성
(:issue:`13635)
통계¶
문서화되지 않았던 tarfile.filemode 함수가 :func:`stat.filemode`로 이동했습니다. 이 함수를 사용하여 파일 모드를 ‘-rwxrwxrwx’ 형태의 문자열로 변환할 수 있습니다.
(Giampaolo Rodolà가 :issue:`14807`에서 기여했습니다.)
구조체¶
struct 모듈은 이제 새 코드 n 및 N 을 통해 ssize_t 와 size_t 를 지원합니다. (Antoine Pitrou가 bpo-3163 에서 기여했습니다.)
서브프로세스¶
명령 문자열이 이제 posix 플랫폼에서 bytes 객체가 될 수 있습니다. (Victor Stinner가 :issue:`8513`에서 기여했습니다.)
새로운 상수 :const:`~subprocess.DEVNULL`을 사용하면 플랫폼에 독립적인 방식으로 출력을 억제할 수 있습니다. (Ross Lagerwall이 :issue:`5870`에서 기여했습니다.)
sys¶
sys 모듈에는 스레드 구현에 대한 정보를 담고 있는 새로운 thread_info named tuple`이 있습니다 (:issue:`11223).
타르파일¶
tarfile`은 이제 :mod:`lzma 모듈을 통해 lzma 인코딩을 지원합니다. (Lars Gustäbel이 :issue:`5689`에서 기여했습니다.)
tempfile¶
tempfile.SpooledTemporaryFile`의 :meth:!truncate` 메서드는 이제 size 매개변수를 허용합니다. (Ryan Kelly가 :issue:`9957`에서 기여했습니다.)
textwrap¶
textwrap 모듈에는 텍스트 블록의 선택된 줄에 공통 접두사를 추가하는 작업을 간편하게 해주는 새로운 indent`가 있습니다 (:issue:`13857()).
threading¶
threading.Condition, threading.Semaphore, threading.BoundedSemaphore, threading.Event, 및 :class:`threading.Timer`는 모두 이전에 클래스 인스턴스를 반환하는 팩토리 함수였지만, 이제는 클래스로서 상속받을 수 있습니다. (Éric Araujo가 :issue:`10968`에서 기여했습니다.)
threading.Thread 생성자는 부모 스레드로부터 daemon 플래그 값을 상속받는 기본 동작을 무시하기 위해 이제 daemon 키워드 인자를 허용합니다 (bpo-6064).
이전에 private 함수였던 _thread.get_ident 가 공용 함수 threading.get_ident() 로 사용할 수 있게 되었습니다. 이를 통해 표준 라이브러리에서 _thread 모듈에 직접 접근하던 여러 사례가 제거되었습니다. _thread.get_ident 를 사용하던 타사 코드는 이와 마찬가지로 새로운 공개 인터페이스를 사용하도록 변경해야 합니다.
time¶
PEP 418 은 time 모듈에 새로운 함수를 추가했습니다:
get_clock_info(): 시계에 대한 정보를 가져옵니다.monotonic(): 단조 시간(뒤로 갈 수 없음)으로 시스템 클록 업데이트의 영향을 받지 않습니다.perf_counter(): 짧은 지속 시간을 측정하기 위한 가장 높은 해상도의 성능 카운터입니다.process_time(): 현재 프로세스의 시스템 및 사용자 CPU 시간 합계입니다.
다른 새로운 함수들:
clock_getres(),clock_gettime()및clock_settime()함수는CLOCK_xxx상수를 사용합니다. (Victor Stinner가 :issue:`10278`에서 기여했습니다.)
플랫폼 간 일관성을 개선하기 위해, :func:`~time.sleep`은 이제 음수 슬립 값이 전달될 때 :exc:`ValueError`를 발생시킵니다. 이전에는 posix에서 오류였지만 Windows에서는 무한 지연을 발생시켰습니다.
types¶
새로운 types.MappingProxyType 클래스를 추가합니다: 매핑의 읽기 전용 프록시입니다. (bpo-14386)
새로운 함수 types.new_class`와 :func:`types.prepare_class`는 :pep:`3115`를 준수하는 동적 타입 생성에 대한 지원을 제공합니다. (:issue:`14588())
unittest¶
assertRaises(), assertRaisesRegex(), assertWarns(), and
assertWarnsRegex() now accept a keyword argument msg when used as
context managers. (Contributed by Ezio Melotti and Winston Ewert in
bpo-10775.)
unittest.TestCase.run`은 이제 :class:`~unittest.TestResult() 객체를 반환합니다.
urllib¶
Request 클래스는 이제 method 인자를 받아 예를 들어, 이 코드는 `()’HEAD’`` 요청을 보낼 것입니다:
>>> urlopen(Request('https://www.python.org', method='HEAD'))
웹 브라우저¶
webbrowser 모듈은 더 많은 “브라우저”를 지원합니다. Google Chrome(버전 및 운영체제에 따라 chrome, chromium, chrome-browser 또는 chromium-browser`로 지정됨), 그리고 FreeDesktop.org 프로젝트의 범용 런처인 :program:`xdg-open, GNOME 3의 기본 URI 핸들러인 :program:`gvfs-open`을 지원합니다. (전자는 Arnaud Calmettes가 :issue:`13620`에서 기여했고, 후자는 Matthias Klose가 :issue:`14493`에서 기여했습니다.)
xml.etree.ElementTree¶
xml.etree.ElementTree 모듈은 이제 C 가속기를 기본으로 가져오며, xml.etree.cElementTree`를 명시적으로 가져올 필요가 없습니다 (이 모듈은 하위 호환성을 위해 유지되지만, 현재는 사용 중단되었습니다). 또한, :class:`~xml.etree.ElementTree.Element`의 ``iter` 계열 메서드들이 최적화되었고(C로 재작성됨), 모듈 설명에도 예시 추가 및 더 자세한 레퍼런스를 통해 대폭 개선되었습니다.
zlib¶
새 속성 zlib.Decompress.eof`를 통해 제대로 형성된 압축 스트림과 불완전하거나 잘린 스트림을 구별하는 것이 가능해졌습니다. (Contributed by Nadeem Vawda in :issue:`12646.)
새 상수 zlib.ZLIB_RUNTIME_VERSION`은 런타임에 로드되는 기본 ``zlib` 라이브러리의 버전 문자열을 보고합니다. (Contributed by Torsten Landschoff in bpo-12306.)
최적화¶
주요 성능 향상이 추가되었습니다:
PEP 393 덕분에 유니코드 문자열에 대한 일부 작업이 최적화되었습니다:
메모리 사용 공간은 텍스트에 따라 2~4배로 줄어듭니다.
ASCII 문자열을 UTF-8로 인코딩하는 경우, 더 이상 문자를 인코딩할 필요가 없으며, UTF-8 표현은 ASCII 표현과 공유됩니다.
UTF-8 인코더가 최적화되었습니다.
단일 ASCII 문자를 반복하고 ASCII 문자열의 부분 문자열을 얻는 것이 4배 더 빠릅니다.
UTF-8은 이제 2배~4배 빠르며, UTF-16 인코딩은 최대 10배 빠릅니다.
빌드 및 C API 변경 사항¶
파이썬의 빌드 프로세스와 C API에 대한 변경 사항은 다음과 같습니다:
새로운 PEP 3118 관련 함수:
:pep:`393`는 새로운 유니코드 타입, 매크로 및 함수를 추가했습니다:
고수준 API:
저수준 API:
PyUnicode_DATA,PyUnicode_1BYTE_DATA,PyUnicode_2BYTE_DATA,PyUnicode_4BYTE_DATAPyUnicode_KIND와PyUnicode_Kind열거형:PyUnicode_WCHAR_KIND,PyUnicode_1BYTE_KIND,PyUnicode_2BYTE_KIND,PyUnicode_4BYTE_KIND
PyArg_ParseTuple는 이제c형식에 대해bytearray를 허용합니다 (bpo-12380).
폐지됨¶
지원되지 않는 운영 체제¶
OS/2 및 VMS는 유지 관리자가 없어 더 이상 지원되지 않습니다.
Windows 2000 및 COMSPEC 을 command.com 으로 설정하는 Windows 플랫폼은 유지 관리 부담 때문에 더 이상 지원되지 않습니다.
3.2에서 사용 중단된 OSF 지원이 완전히 제거되었습니다.
사용 중단된 Python 모듈, 함수 및 메서드¶
object.__format__()`에 빈 문자열이 아닌 문자열을 전달하는 것은 사용이 중단되었으며, Python 3.4에서 :exc:`TypeError`를 발생시킵니다 (:issue:`9856).
:pep:`393 때문에
unicode_internal코덱은 사용이 중단되었습니다. 대신 UTF-8, UTF-16(utf-16-le 또는 utf-16-be), 또는 UTF-32(utf-32-le 또는 utf-32-be)를 사용하십시오ftplib.FTP.nlst()및ftplib.FTP.dir`(): :meth:`ftplib.FTP.mlsd`를 사용하십시오.platform.popen`():subprocess모듈을 사용하세요. 특히 이전 함수를 subprocess 모듈로 교체하기 섹션 (bpo-11377)\를 확인하십시오.bpo-13374:
os모듈에서 윈도우 bytes API는 폐지되었습니다. 더 이상 ANSI 코드 페이지에 의존하지 않고 모든 파일 이름을 지원하려면 바이트 이름 대신 유니코드 파일 이름을 사용하십시오.bpo-13988:
xml.etree.cElementTree모듈은 폐지되었습니다. 해당 가속기는 사용 가능할 때 자동으로 사용됩니다.time.clock``의 동작은 플랫폼에 따라 다릅니다: 잘 정의된 동작을 얻으려면 필요한 요구 사항에 따라 새로운 :func:`time.perf_counter()또는time.process_time()함수를 사용하십시오.os.stat_float_times`()함수는 폐지되었습니다.abc모듈::deco:`abc.abstractproperty`는 더 이상 사용되지 않으므로, 대신 :deco:`abc.abstractmethod`와 함께 :deco:`property`를 사용하십시오.
:deco:`abc.abstractclassmethod`는 더 이상 사용되지 않으므로, 대신 :deco:`abc.abstractmethod`와 함께 :deco:`classmethod`를 사용하십시오.
:deco:`abc.abstractstaticmethod`는 더 이상 사용되지 않으므로, 대신 :deco:`abc.abstractmethod`와 함께 :deco:`staticmethod`를 사용하십시오.
importlib패키지:
폐지된 C API 함수 및 타입¶
:c:type:`Py_UNICODE``은 :pep:`393`을 통해 폐지되었으며 Python 4에서는 제거될 예정입니다. 이 타입을 사용하는 모든 함수는 폐지되었습니다:
Unicode functions and methods using Py_UNICODE and
Py_UNICODE* types:
PyUnicode_FromUnicode`:PyUnicode_FromWideChar()또는 :c:func:`PyUnicode_FromKindAndData`를 사용하십시오.PyUnicode_AS_UNICODE,PyUnicode_AsUnicode(),PyUnicode_AsUnicodeAndSize():PyUnicode_AsWideCharString()를 사용하십시오.PyUnicode_AS_DATA:PyUnicode_DATA와PyUnicode_READ, 그리고PyUnicode_WRITE를 사용하십시오.PyUnicode_GET_SIZE,PyUnicode_GetSize():PyUnicode_GET_LENGTH또는PyUnicode_GetLength()를 사용하십시오.PyUnicode_GET_DATA_SIZE:PyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)을 사용하십시오 (준비된 문자열에만 적용).PyUnicode_AsUnicodeCopy`():PyUnicode_AsUCS4Copy()또는 :c:func:`PyUnicode_AsWideCharString`를 사용하십시오.PyUnicode_GetMax()
Py_UNICODE* 문자열을 조작하는 함수 및 매크로:
Py_UNICODE_strlen(): usePyUnicode_GetLength()orPyUnicode_GET_LENGTHPy_UNICODE_strcat(): usePyUnicode_CopyCharacters()orPyUnicode_FromFormat()Py_UNICODE_strcpy(),Py_UNICODE_strncpy(),Py_UNICODE_COPY(): usePyUnicode_CopyCharacters()orPyUnicode_Substring()Py_UNICODE_strcmp(): usePyUnicode_Compare()Py_UNICODE_strncmp(): usePyUnicode_Tailmatch()Py_UNICODE_strchr(),Py_UNICODE_strrchr(): usePyUnicode_FindChar()Py_UNICODE_FILL(): usePyUnicode_Fill()Py_UNICODE_MATCH
인코더:
PyUnicode_Encode`(): :c:func:`!PyUnicode_AsEncodedObject`를 사용하십시오.PyUnicode_EncodeUTF7()PyUnicode_EncodeUTF8`():PyUnicode_AsUTF8()또는 :c:func:`PyUnicode_AsUTF8String`을 사용하십시오.PyUnicode_EncodeUTF32()PyUnicode_EncodeUTF16():c:func:`!PyUnicode_EncodeUnicodeEscape``를 사용하려면 :c:func:`PyUnicode_AsUnicodeEscapeString`을 사용하십시오.
:c:func:`!PyUnicode_EncodeRawUnicodeEscape``를 사용하려면 :c:func:`PyUnicode_AsRawUnicodeEscapeString`을 사용하십시오.
PyUnicode_EncodeLatin1`(): :c:func:`PyUnicode_AsLatin1String`를 사용하십시오.PyUnicode_EncodeASCII`(): :c:func:`PyUnicode_AsASCIIString`을 사용하십시오.PyUnicode_EncodeCharmap()PyUnicode_TranslateCharmap()PyUnicode_EncodeMBCS():PyUnicode_AsMBCSString()또는PyUnicode_EncodeCodePage()(CP_ACP 코드를 사용)를 사용하십시오.PyUnicode_EncodeDecimal(),PyUnicode_TransformDecimalToASCII()
폐지된 기능들¶
array 모듈의 'u' 형식 코드는 이제 폐지되었으며, 나머지 (Py_UNICODE) API와 함께 Python 4에서도 제거될 것입니다.
Python 3.3으로 이식하기¶
이 섹션에서는 이전에 설명된 변경 사항과 코드를 수정해야 할 수 있는 다른 버그 수정 사항을 나열합니다.
Python 코드 이전하기¶
해시 무작위화는 기본적으로 활성화되어 있습니다. 해시 무작위화를 비활성화하려면
PYTHONHASHSEED환경 변수를0``으로 설정하십시오. 또한 :meth:`object.__hash__메서드도 참고하십시오.bpo-12326: Linux에서 sys.platform은 더 이상 주(major) 버전을 포함하지 않습니다. 이제 사용된 Python 버전에 따라 ‘linux2’ 또는 ‘linux3’과 같은 것이 아닌, 항상
'linux'입니다. sys.platform == ‘linux2’를 sys.platform.startswith(‘linux’)로 대체하거나, 구형 Python 버전을 지원할 필요가 없다면 직접 sys.platform == ‘linux’를 사용하세요.bpo-13847, bpo-14180:
timeanddatetime:OverflowErroris now raised instead ofValueErrorif a timestamp is out of range.OSErroris now raised if C functionsgmtime()orlocaltime()failed.임포트에서 기본으로 사용되는 파인더는 특정 디렉터리 내용을 캐시로 활용합니다. Python 소스 파일을 생성하거나 소스 없는 바이트코드를 파일로 만들었으면, 파인더가 새 파일을 감지하도록 :func:`importlib.invalidate_caches`를 호출하여 캐시를 지우세요.
:exc:`ImportError`는 이제 임포트하려고 시도된 모듈의 전체 이름을 사용합니다. ImportErrors 메시지를 확인하는 doctest는 단순히 이름의 일부 대신 모듈의 전체 이름을 사용하도록 업데이트해야 합니다.
:func:`__import__`의 index 인수는 이제 기본값이 -1 대신 0으로 설정되었고, 음수 값은 더 이상 지원하지 않습니다. :pep:`328`이 구현되었을 때 기본값이 -1로 남아 있었던 것은 간과한 것입니다. 상대 임포트 후에 절대 임포트를 계속 수행해야 하는 경우, 인덱스 1을 사용하여 상대 임포트를 먼저 수행하고, 다음으로 인덱스 0을 사용한 또 다른 임포트를 수행하세요. 다만, :func:`__import__`를 직접 호출하기보다 :func:`importlib.import_module`을 사용하는 것이 선호됩니다.
__import__()는 더 이상 최상위 모듈에 인덱스 값으로 0 이외의 값을 사용하는 것을 허용하지 않습니다. 예:__import__('sys', level=1)은 이제 오류입니다.:data:`sys.meta_path`와 :data:`sys.path_hooks`는 기본적으로 파인더를 가지게 되었으므로, 이러한 리스트에 추가하려면 주로 :meth:`list.insert`를 사용하는 것이 :meth:`list.append`보다 좋습니다.
None이 이제sys.path_importer_cache에 삽입되므로, 파인더가 없는 경로 딕셔너리에서 항목을 지울 때는 하위 호환성을 위해None값과 함께 쌍을 이루는 키와imp.NullImporter를 제거해야 합니다. 이로 인해 이전 버전의 Python은None을sys.path_importer_cache에 재삽입하며 추가적인 오버헤드가 발생하지만, 이는 암묵적 파인더의 사용을 나타낼 뿐 본질적으로는 아무것도 변경하지 않습니다.importlib.abc.Finder는 더 이상 구현되어야 하는find_module()추상 메서드를 지정하지 않습니다. 만약 하위 클래스에 해당 메서드 구현에 의존했다면, 먼저 메서드의 존재 여부를 확인하세요. 다만, path entry finders 를 다루는 경우,find_loader()의 존재 여부를 먼저 확인하는 것이 좋을 것입니다.pkgutil`은 내부적으로 :mod:`importlib`을 사용하도록 변환되었습니다. 이는 오래된 :pep:`302임포트 에뮬레이션의 동작이 실제 임포트 시스템의 동작과 일치하지 않아 발생했던 많은 엣지 케이스들을 제거합니다. 임포트 에뮬레이션 자체는 여전히 존재하지만, 이제 Deprecated 상태입니다. 또한,pkgutil.iter_importers()및pkgutil.walk_packages()함수는 표준 임포트 후크를 특별 처리하여, 표준화되지 않은iter_modules()메서드를 제공하지 않음에도 불구하고 여전히 지원되도록 합니다.email.header.decode_header`가 수행하는 파싱의 오래된 RFC-규정 준수 버그 (:issue:`1079())가 수정되었습니다. 인코딩된 헤더를 유니코드로 변환하기 위해 표준 관용구(str(make_header(decode_header(h))))를 사용하는 코드는 변화된 점이 없지만, decode_header`가 반환하는 개별 튜플을 확인하는 코드에서는 ``ASCII` 섹션을 앞뒤로 둘러싼 공백이 이제ASCII섹션에 포함되어 있음을 알 수 있습니다. 또한,make_header``를 사용하여 헤더를 구축하는 코드는 변경 없이 계속 작동해야 합니다. 이는 `make_header`가 입력 문자열에 이미 존재하지 않는 경우, ``ASCII``와 비-``ASCII섹션 사이에 공백을 추가하기 때문입니다.email.utils.formataddr`는 이제 비-``ASCII`()표시 이름을 전달할 때 올바른 콘텐츠 전송 인코딩을 수행합니다. 이전의 버그로 인해 보존되던 비-ASCII유니코드가 포맷된 출력 문자열에 의존했던 코드는 수정해야 합니다 (bpo-1690608).poplib.POP3.quit`는 다른 모든 ``poplib`()메서드처럼 이제 프로토콜 오류를 발생시킬 수 있습니다.quit``이 :exc:`poplib.error_proto` 오류를 발생시키지 않는다고 가정하는 코드는 특정 애플리케이션에서 ``quit시 오류가 발생하는 경우 수정해야 할 수도 있습니다 (bpo-11291).Python 2.4 버전부터 사용되지 않은
email.parser.Parser`의 ``strict`인수가 마침내 제거되었습니다.더 이상 사용하지 않는 메서드인 `unittest.TestCase.assertSameElements`가 제거되었습니다.
더 이상 사용하지 않는 변수인 `time.accept2dyear`가 제거되었습니다.
decimal모듈에서 더 이상 사용하지 않는Context._clamp속성이 제거되었습니다. 이전에 이 속성은 공개 속성인(참고: :issue:`8540.)문서화되지 않은 내부 헬퍼 클래스
SSLFakeFile가smtplib에서 제거되었으며, 그 기능은 오랫동안socket.socket.makefile()에 의해 직접 제공되어 왔습니다.Windows에서 :func:`time.sleep`에 음수 값을 전달하면 이제 영원히 대기하는 대신 오류를 발생시킵니다. 포스식 운영체제(posix)에서는 항상 오류를 발생시켜 왔습니다.
ast.__version__상수가 제거되었습니다. AST 버전에 영향을 받는 결정을 내려야 하는 경우, :data:`sys.version_info`를 사용하여 결정을 내리십시오.threading모듈이 내부 클래스를 상속하여 팩토리 함수를 사용하는 사실을 우회했던 코드는 이제 공개된 클래스를 상속하도록 변경해야 합니다.스레딩 모듈에 있던 문서화되지 않은 디버깅 장치가 제거되어 코드가 단순화되었습니다. 이는 프로덕션 코드에는 영향을 미치지 않아야 하지만, 어떤 애플리케이션 디버그 프레임워크가 이 부분과 상호 작용하는 경우를 대비하여 여기에 언급됩니다 (bpo-13550).
C 코드 포팅하기¶
In the course of changes to the buffer API the undocumented
smalltablemember of thePy_bufferstructure has been removed and the layout of thePyMemoryViewObjecthas changed.memoryobject.h또는object.h의 관련 부분을 사용하는 모든 확장 프로그램은 재빌드해야 합니다.PEP 393 <pep-393>`로 인해 :c:type:`Py_UNICODE 타입과 이 타입을 사용하는 모든 함수가 사용 중단되었습니다 (하지만 최소 5년 동안은 사용할 수 있습니다). 유니코드 객체를 구성하고 접근하기 위해 저수준 유니코드 API를 사용했으며, :pep:`393`이 제공하는 메모리 공간 절약의 혜택을 받고 싶다면 코드를 새로운 :doc:`Unicode API <../c-api/unicode>`로 변환해야 합니다.
하지만,
PyUnicode_Concat(),PyUnicode_Join()또는 :c:func:`PyUnicode_FromFormat()`와 같은 고수준 함수만 사용했다면, 코드는 자동으로 새로운 유니코드 표현을 활용할 것입니다.PyImport_GetMagicNumber()는 이제 실패 시-1를 반환합니다.__import__`의 *level* 인수에 음수 값이 더 이상 유효하지 않기 때문에, :c:func:`PyImport_ImportModuleLevel`에서도 마찬가지입니다. 이는 또한 :c:func:`PyImport_ImportModuleEx`에 사용되는 *level* 값은 이제 `()-1``가 아니라0임을 의미합니다.
C 확장 빌드하기¶
C 확장의 가능한 파일명 범위가 좁혀졌습니다. 거의 사용되지 않는 철자는 생략되었습니다: POSIX 하에서
xxxmodule.so,xxxmodule.abi3.so및xxxmodule.cpython-*.so``로 이름 붙여진 파일은 더 이상 ``xxx모듈을 구현하는 것으로 인식되지 않습니다. 이러한 파일을 생성해왔다면 다른 철자(즉, 파일명에서module문자열을 제거)로 전환해야 합니다.(:issue:`14040`에 구현됨.)