Python

Python 3.3의 새로운 기능

이 기사는 Python 3.2와 비교하여 Python 3.3의 새로운 기능에 대해 설명합니다. Python 3.3은 2012년 9월 29일에 출시되었습니다. 자세한 내용은 changelog 를 참조하십시오.

더 보기

PEP 398 - Python 3.3 출시 일정

요약 – 릴리스 하이라이트

새로운 문법 기능:

  • 제너레이터 위임 <pep-380>`을 위한 새로운 ``yield from` 표현식.

  • str 객체에 대해 u'unicode' 구문이 다시 허용됩니다.

새로운 라이브러리 모듈:

  • faulthandler (저수준 충돌 디버깅 지원)

  • ipaddress (IP 주소 및 마스크를 나타내는 고수준 객체)

  • lzma (XZ / LZMA 알고리즘을 사용하여 데이터를 압축)

  • unittest.mock (테스트 대상 시스템의 일부를 모의(mock) 객체로 대체)

  • venv (인기 있는 virtualenv 패키지와 유사한 파이썬 가상 환경)

새로운 내장 기능:

구현 개선 사항:

대폭 개선된 라이브러리 모듈:

보안 개선 사항:

  • 해시 난수화가 기본적으로 활성화됩니다.

사용자 대상 변경 사항에 대한 전체 목록을 확인하려면 계속 읽어주십시오.

PEP 405: 가상 환경

가상 환경은 시스템 전체의 기본 설치를 공유하면서도 유지관리가 용이하도록 별도의 파이썬 설정을 만드는 데 도움을 줍니다. 가상 환경은 자체적인 전용 사이트 패키지(즉, 로컬에 설치된 라이브러리)를 가지며, 선택적으로 시스템 전체 사이트 패키지와 분리됩니다. 이 개념과 구현은 인기 있는 virtualenv 서드파티 패키지에서 영감을 받았지만, 인터프리터 핵심과의 더욱 긴밀한 통합을 통해 이점을 얻습니다.

이 PEP는 프로그램 방식의 접근을 위한 venv 모듈과 명령줄 기반 접근 및 관리를 위한 pyvenv 스크립트를 추가합니다. 파이썬 인터프리터는 가상 환경 디렉터리 트리의 기반을 나타내는 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()를 포함합니다. 많은 새로운 기능이 추가되었으며, 대부분은 비연속적 배열 및 서브 오프셋(suboffset)이 있는 배열에 대해 일반적인 경우에도 작동합니다.

문서가 업데이트되어 제공자(exporter)와 소비자(consumer)의 책임을 명확하게 기술했습니다. 버퍼 요청 플래그는 기본 및 복합 플래그로 그룹화되었습니다. 비연속적이고 다차원인 NumPy 스타일 배열의 메모리 레이아웃이 설명되었습니다.

기능

  • struct 모듈 문법의 모든 네이티브 단일 문자 형식 지정자(선택적으로 ‘@’ 접두사가 붙음)가 이제 지원됩니다.

  • 일부 제한 사항이 있으나, cast() 메서드를 통해 C 연속 배열의 형식과 모양을 변경할 수 있습니다.

  • 다차원 리스트 표현이 모든 배열 유형에서 지원됩니다.

  • 모든 배열 타입에 대해 다차원 비교가 지원됩니다.

  • B, b 또는 c 형식을 가진 해시 가능(읽기 전용) 타입의 1차원 memoryview가 이제 해시 가능합니다. (bpo-13411 에서 Antoine Pitrou 제공)

  • 모든 1차원 배열 타입에 대한 임의 슬라이싱이 지원됩니다. 예를 들어, 이제 음수 증분을 사용하여 memoryview를 O (1) 내에 뒤집는 것이 가능합니다.

API 변경 사항

  • 최대 차원 수가 공식적으로 64로 제한됩니다.

  • 빈 모양(shape), 스트라이드(stride) 및 서브 오프셋(suboffset)의 표현이 이제 None 대신 빈 튜플로 변경됩니다.

  • 형식 ‘B’(부호 없는 바이트)를 사용하는 memoryview 요소를 액세스하면 이제 정수가 반환됩니다(struct 모듈 문법에 따름). bytes 객체를 반환하려면 먼저 뷰를 ‘c’로 캐스트해야 합니다.

  • memoryview 비교는 이제 피연산자의 논리적 구조를 사용하며 모든 배열 요소를 값으로 비교합니다. struct 모듈 문법의 모든 형식 문자열이 지원됩니다. 인식되지 않는 형식 문자열을 사용하는 뷰도 허용되지만, 내용에 관계없이 항상 서로 다르게 비교됩니다.

  • 추가 변경 사항은 Build and C API ChangesPorting C code 를 참조하십시오.

(Stefan Krah에 의해 bpo-10181 에서 제공됨)

더 보기

PEP 3118 - 버퍼 프로토콜 개정

PEP 393: 유연한 문자열 표현

유니코드 문자열 타입이 표현되는 문자 중 가장 큰 유니코드 순서(1, 2 또는 4 바이트)에 따라 여러 내부 표현을 지원하도록 변경되었습니다. 이를 통해 일반적인 경우 공간 효율적인 표현이 가능해졌으며, 모든 시스템에서 전체 UCS-4에 접근할 수 있게 되었습니다. 기존 API와의 호환성을 위해 여러 표현이 병행될 수 있으며, 시간이 지남에 따라 이러한 호환성은 점진적으로 제거될 예정입니다.

파이썬 측면에서 이 변경으로 인한 단점은 없습니다.

C API 측면에서 PEP 393 은 완전히 하위 호환됩니다. 레거시 API는 최소 5년 동안 유지됩니다. 레거시 API를 사용하는 애플리케이션은 메모리 절감 효과를 충분히 누리지 못하거나, 오히려 파이썬이 각 문자열의 두 버전(레거시 형식 및 새로운 효율적인 저장 방식)을 모두 유지해야 하므로 약간 더 많은 메모리를 사용할 수도 있습니다.

기능

PEP 393 에 의해 도입된 변경 사항은 다음과 같습니다.

  • 파이썬은 이제 비-BMP를 포함한 전체 유니코드 코드 포인트 범위(즉, U+0000 에서 U+10FFFF 까지)를 항상 지원합니다. 좁은(narrow) 빌드와 넓은(wide) 빌드 간의 구분이 더 이상 존재하지 않으며, 파이썬은 윈도우 환경에서도 넓은 빌드처럼 동작합니다.

  • narrow 빌드가 폐지됨에 따라, 다음과 같이 narrow 빌드에 특화된 문제들도 해결되었습니다.

    • len() 은 이제 비-BMP 문자에 대해 항상 1을 반환하므로, len('\U0010FFFF') == 1 이 성립합니다.

    • 문자열 리터럴에서 서로게이트 쌍이 재결합되지 않으므로, '\uDBFF\uDFFF' != '\U0010FFFF' 입니다.

    • 비-BMP 문자를 인덱싱하거나 슬라이스할 때 예상된 값이 반환되므로, 이제 '\U0010FFFF'[0]'\uDBFF' 가 아닌 '\U0010FFFF' 를 반환합니다.

    • 표준 라이브러리의 다른 모든 함수들도 이제 비-BMP 코드 포인트를 올바르게 처리합니다.

  • sys.maxunicode 의 값은 이제 항상 1114111 (16진수로 0x10FFFF)입니다. PyUnicode_GetMax() 함수는 하위 호환성을 위해 여전히 0xFFFF 또는 0x10FFFF 를 반환하며, 새 유니코드 API와 함께 사용해서는 안 됩니다(상세 정보는 bpo-13054 참조).

  • ./configure 플래그 --with-wide-unicode 가 제거되었습니다.

성능 및 자원 사용량

유니코드 문자열 저장은 이제 해당 문자열 내 가장 높은 코드 포인트에 따라 달라집니다.

  • 순수 ASCII 및 Latin1 문자열(U+0000-U+00FF)은 코드 포인트당 1바이트를 사용하며;

  • BMP 문자열(U+0000-U+FFFF)은 코드 포인트당 2바이트를 사용하며;

  • 비-BMP 문자열(U+10000-U+10FFFF)은 코드 포인트당 4바이트를 사용합니다.

이로 인한 결과는 대부분의 애플리케이션에서 문자열 저장에 따른 메모리 사용량이 크게 감소한다는 것입니다. 특히 이전의 wide 유니코드 빌드와 비교할 때 더욱 그러하며, 이는 많은 경우 국제적인 맥락에서도 문자열이 순수 ASCII로 처리되기 때문입니다(많은 문자열이 XML 파편, HTTP 헤더, JSON 인코딩 데이터 등과 같이 인간의 언어가 아닌 데이터를 저장하기 때문임). 또한 같은 이유로 복잡한 애플리케이션에서 CPU 캐시 효율이 향상될 것으로 기대합니다. Django 벤치마크 결과, Python 3.3의 메모리 사용량은 Python 3.2보다 2~3배 적고 Python 2.7보다 약간 더 나은 것으로 나타났습니다(자세한 내용은 해당 PEP를 참조하십시오).

더 보기

PEP 393 - 유연한 문자열 표현

Martin von Löwis가 작성하고, Torsten Becker와 Martin von Löwis가 구현한 PEP

PEP 397: Windows용 파이썬 런처

Python 3.3 Windows 설치 프로그램에 이제 버전과 무관하게 파이썬 애플리케이션을 실행하는 데 사용할 수 있는 py 런처 애플리케이션이 포함되어 있습니다.

이 런처는 *.py 파일을 더블 클릭할 때 암시적으로 호출됩니다. 시스템에 단 하나의 파이썬 버전만 설치된 경우 해당 버전으로 파일이 실행됩니다. 여러 버전이 설치된 경우 기본적으로 가장 최신 버전이 사용되지만, 파이썬 스크립트에 Unix 스타일의 “shebang 라인”을 포함하여 이를 재정의할 수 있습니다.

또한 이 런처는 명령 줄에서 py 애플리케이션으로 명시적으로 사용될 수 있습니다. py``를 실행하면 스크립트를 암시적으로 실행할 때와 동일한 버전 선택 규칙을 따르지만, 적절한 인수를 전달하여 구체적인 버전을 선택할 있습니다 (예를 들어, Python 2도 설치되어 있을 파이썬 3를 요청하려면 ``-3, 더 최신 버전이 설치되어 있을 때 특정 이전 파이썬 버전을 요청하려면 -2.6).

런처 외에도, 이제 Windows 설치 프로그램에 새로 설치된 파이썬을 시스템 PATH에 추가하는 옵션이 포함됩니다. (Brian Curtin이 bpo-3561 에서 기여함.)

더 보기

PEP 397 - Windows용 파이썬 런처

Mark Hammond와 Martin v. Löwis가 작성하고 Vinay Sajip이 구현한 PEP.

런처 설명서: Python Install Manager

설치 시 PATH 수정: Python Install Manager

PEP 3151: OS 및 IO 예외 계층 구조 재작업

운영체제 오류에 의해 발생하는 예외의 계층 구조가 단순화되었으며 더욱 세분화되었습니다.

이제 OSError, IOError, EnvironmentError, WindowsError, mmap.error, socket.error 또는 select.error 중에서 적절한 예외 유형을 선택할지 고민할 필요가 없습니다. 이 모든 예외 유형은 이제 하나인 OSError 로 통합되었습니다. 다른 이름들은 호환성을 위해 별칭으로 유지됩니다.

또한 특정 오류 조건을 포착하기가 더 쉬워졌습니다. errno 모듈의 특정 상수를 위해 errno 어트리뷰브(또는 args[0])를 조사하는 대신, 적절한 OSError 하위 클래스를 포획할 수 있습니다. 사용 가능한 하위 클래스는 다음과 같습니다.

또한 ConnectionError 자체에 세분화된 하위 클래스가 있습니다.

새로운 예외들 덕분에 errno 의 일반적인 사용 사례를 피할 수 있습니다. 예를 들어, 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

이제 errno 임포트 없이, 그리고 예외 어트리뷰브를 수동으로 조사하지 않고도 작성할 수 있습니다:

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")

더 보기

PEP 3151 - OS 및 IO 예외 계층 구조 재작업

Antoine Pitrou가 작성하고 구현한 PEP.

PEP 380: 서브 제너레이터로 위임하는 문법

[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) 값을 직접 수신하고 외부 제너레이터에 최종 값을 반환할 수 있게 합니다:

>>> 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)  # 누산기가 값을 수용할 준비가 되었는지 확인
>>> for i in range(4):
...     acc.send(i)
...
>>> acc.send(None)  # 첫 번째 집계 완료
>>> for i in range(5):
...     acc.send(i)
...
>>> acc.send(None)  # 두 번째 집계 완료
>>> tallies
[6, 10]

이 변경을 추진하는 주요 원칙은 sendthrow 메서드와 함께 사용되도록 설계된 제너레이터조차도 하나의 큰 함수를 여러 개의 하위 함수로 나누는 것만큼 쉽게 여러 개의 서브 제너레이터로 나눌 수 있게 하는 것입니다.

더 보기

PEP 380 - 서브 제너레이터로 위임하는 문법

Greg Ewing이 작성하고 구현했으며, Renaud Blanch, Ryan Kelly 및 Nick Coghlan에 의해 3.3에 통합되었고, Zbigniew Jędrzejewski-Szmek과 Nick Coghlan이 문서화한 PEP.

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

원인을 억제하기 위한 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.

PEP 414: 명시적 유니코드 리터럴

유니코드 리터럴을 많이 사용하는 유니코드 인식 파이썬 애플리케이션의 Python 2에서 전환을 용이하게 하기 위해, Python 3.3은 문자열 리터럴에 대해 “u” 접두사를 다시 지원합니다. 이 접두사는 Python 3에서 의미론적 중요성이 없으며, 오직 Python 3로 마이그레이션할 때의 단순 기계적 변경 사항을 줄여 개발자가 더 중요한 의미론적 변화(예: 바이너리와 텍스트 데이터의 엄격한 기본 분리)에 집중할 수 있도록 제공됩니다.

더 보기

PEP 414 - 명시적 유니코드 리터럴

Armin Ronacher가 작성한 PEP.

PEP 3155: 클래스와 함수의 정규화된 이름

함수 및 클래스 객체는 모듈의 최상위 수준에서 정의 위치까지의 “경로”를 나타내는 새로운 __qualname__ 어트리뷰트를 가집니다. 전역 함수와 클래스의 경우 이는 __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() 는 파이썬 콜러블의 내부 검사를 쉽고 직관적으로 만들어줍니다. 데코레이터 적용 여부와 상관없는 파이썬 함수, 클래스, 그리고 functools.partial() 객체 등 광범위한 콜러블을 지원합니다. 새로운 클래스인 inspect.Signature, inspect.Parameter, inspect.BoundArguments 는 어노테이션, 기본값, 매개변수 유형 및 바인딩된 인자와 같은 호출 시그니처에 대한 정보를 담고 있어, 데코레이터 작성이나 호출 시그니처 또는 인자를 검증하거나 수정하는 코드를 작성하는 것을 상당히 간소화합니다.

더 보기

PEP 362: - 함수 시그니처 객체

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

The implementation of sys.implementation also introduces a new type to Python: types.SimpleNamespace. In contrast to a mapping-based namespace, like dict, SimpleNamespace is attribute-based, like object. However, unlike object, SimpleNamespace instances are writable. This means that you can add, remove, and modify the namespace through normal attribute access.

더 보기

PEP 421 - sys.implementation 추가

Eric Snow가 작성하고 구현한 PEP입니다.

임포트 구현체로 importlib 사용

bpo-2377 - __import__를 importlib.__import__로 교체 bpo-13959 - imp`의 일부를 순수 파이썬으로 재구현 :issue:`14605 - 임포트 메커니즘을 명시적으로 전환 bpo-14646 - 로더가 __loader__와 __package__를 설정하도록 요구

__import__() 함수는 이제 importlib.__import__() 에 의해 구동됩니다. 이 작업으로 인해 PEP 302 의 “단계 2”가 완료되었습니다. 이러한 변경에는 여러 가지 장점이 있습니다. 첫째, C 코드 내에 암시적으로 숨겨져 있던 임포트를 구동하는 메커니즘이 더 많이 공개되었습니다. 또한 파이썬 3.3을 지원하는 모든 Python VM이 공통으로 사용할 수 있는 단일 구현을 제공하여, VM마다 달랐던 임포트 의미론의 차이를 없애는 데 도움이 됩니다. 마지막으로 임포트 유지관사를 용이하게 하여 향후 확장이 가능해졌습니다.

일반 사용자의 경우 의미상 눈에 띄는 변화는 없습니다. 현재 코드가 임포트를 조작하거나 프로그래밍 방식으로 호출하는 경우를 위해 필요한 코드 변경 사항은 이 문서의 Porting Python code 섹션에서 다룹니다.

새로운 API

이 작업의 큰 장점 중 하나는 임포트 문을 작동하게 만드는 구성 요소들이 노출되었다는 것입니다. 즉, 이전에는 암시적이었던 다양한 임포터들이 이제 importlib 패키지의 일부로 완전히 공개되었습니다.

importlib.abc 에 정의된 추상 베이스 클래스가 확장되어, 각각 importlib.abc.MetaPathFinderimportlib.abc.PathEntryFinder 를 도입함으로써 메타 경로 파인더경로 엔트리 파인더 를 올바르게 구분합니다. 기존의 importlib.abc.Finder ABC는 이제 하위 호환성을 위해서만 제공되며 메서드 요구 사항을 강제하지 않습니다.

파인더 측면에서 보면, importlib.machinery.FileFinder 는 모듈의 소스 및 바이트코드 파일을 찾는 데 사용되는 메커니즘을 노출합니다. 이전에는 이 클래스가 sys.path_hooks 의 암시적인 멤버였습니다.

로더의 경우, 새로운 추상 베이스 클래스인 importlib.abc.FileLoader 는 모듈 코드의 저장소로 파일 시스템을 사용하는 로더를 작성하는 데 도움을 줍니다. 소스 파일용 로더(importlib.machinery.SourceFileLoader), 소스가 없는 바이트코드 파일용 로더(importlib.machinery.SourcelessFileLoader), 확장 모듈용 로더(importlib.machinery.ExtensionFileLoader)를 이제 직접 사용할 수 있습니다.

ImportError`에 제공 가능한 관련 데이터가 있는 경우 설정되는 ``name`path 어트리뷰트가 추가되었습니다. 이제 임포트 실패 시 메시지에 모듈 이름의 끝부분만이 아닌 전체 이름이 표시됩니다.

importlib.invalidate_caches() 함수는 이제 필요한 경우 저장된 상태를 정리하기 위해 sys.path_importer_cache 에 캐시된 모든 파인더에서 동일한 이름의 메서드를 호출합니다.

눈에 띄는 변경 사항

코드에서 발생할 수 있는 필요한 변경 사항은 Porting Python code 섹션을 참조하십시오.

importlib 이 노출하는 범위 외에도 임포트와 관련된 다른 눈에 띄는 변경 사항이 있습니다. 가장 큰 변화는 sys.meta_pathsys.path_hooks 가 이제 임포트에서 사용되는 모든 메타 경로 파인더와 경로 엔트리 훅을 저장한다는 점입니다. 이전에는 파인더들이 직접 노출되지 않고 C 코드 내에 암시적으로 숨겨져 있었습니다. 이로 인해 이제 사용자 필요에 맞춰 다양한 파인더를 쉽게 제거하거나 순서를 변경할 수 있습니다.

또 다른 변화는 모든 모듈이 해당 모듈을 생성하는 데 사용된 로더를 저장하는 __loader__ 어트리뷰트를 갖게 되었다는 점입니다. PEP 302 가 업데이트되어 로더가 이 어트리뷰트를 구현하도록 의무화했으므로, 향후 타사(3rd-party) 로더들이 업데이트되면 사용자들은 해당 어트리뷰스의 존재에 의존할 수 있게 됩니다. 하지만 그때까지는 임포트 시스템이 모듈을 로드한 후 이 값을 설정합니다.

또한 로더는 이제 PEP 366 에 따라 __package__ 어트리뷰트를 설정해야 합니다. 이 역시 임포트 시스템이 이미 모든 importlib 로더에 대해 이를 설정하고 있으며, 모듈을 로드한 후 해당 어트리뷰스를 설정합니다.

sys.path_hooks 에서 파인더를 찾을 수 없는 경우 이제 sys.path_importer_cacheNone 이 삽입됩니다. imp.NullImportersys.path_hooks 에 직접 노출되지 않으므로, 이를 찾는 결과가 없음을 나타내는 값으로 항상 사용할 수 있다는 것을 더 이상 신뢰할 수 없기 때문입니다.

기타 모든 변경 사항은 Python 3.3용 코드를 업데이트할 때 고려해야 하는 의미론적 변경이며, 이와 관련한 내용은 본 문서의 Porting Python code 섹션에서 확인할 수 있습니다.

(Brett Cannon이 구현)

기타 언어 변경 사항

핵심 파이썬 언어에 가해진 일부 작은 변경 사항은 다음과 같습니다:

  • 유니코드 이름 별칭 및 명명된 시퀀스 지원이 추가되었습니다. 이제 unicodedata.lookup()'\N{...}' 가 모두 이름 별칭을 해석하며, unicodedata.lookup() 은 명명된 시퀀스도 해제합니다.

    (Ezio Melotti가 bpo-12753 에서 기여).

  • 유니코드 데이터베이스가 UCD 버전 6.1.0으로 업데이트되었습니다.

  • range() 객체의 동등성 비교 시 이제 해당 범위 객체에 의해 생성된 기본 시퀀스의 동등성을 반영하는 결과가 반환됩니다. (bpo-13201)

  • bytesbytearray 객체의 count(), find(), rfind(), index()rindex() 메서드가 이제 첫 번째 인자로 0에서 255 사이의 정수를 수용합니다.

    (Petri Lehtinen이 bpo-12170 에서 기여).

  • bytesbytearrayrjust(), ljust()center() 메서드가 이제 fill 인자로 bytearray 를 수용합니다. (Petri Lehtinen이 bpo-12380 에서 기여).

  • listbytearray 에 새로운 메서드인 copy()clear() 가 추가되었습니다. (bpo-10516). 결과적으로, MutableSequence 도 이제 clear() 메서드를 정의합니다. (bpo-11388).

  • 원시 바이트 리터럴을 이제 br"..." 뿐만 아니라 rb"..." 로도 쓸 수 있습니다.

    (Antoine Pitrou가 bpo-13748 에서 기여).

  • dict.setdefault() 은 이제 주어진 키에 대해 단 한 번의 조회만 수행하며, 이로 인해 내장 타입과 함께 사용할 때 원자성을 갖게 됩니다.

    (Filip Gruszczyński가 bpo-13521 에서 기여).

  • 함수 호출이 함수 시그니처와 일치하지 않을 때 발생하는 오류 메시지가 대폭 개선되었습니다.

    (Benjamin Peterson이 기여).

더 세분화된 임포트 잠금

이전 버전의 CPython은 항상 전역 임포트 잠금에 의존했습니다. 이는 모듈을 임포트할 때 다른 스레드에서 코드 실행이 부수 효과로 발생하여 데드락이 발생하는 등의 예상치 못한 번거로움으로 이어졌습니다. 때로는 PyImport_ImportModuleNoBlock() C API 함수와 같은 서툰 우회 방법이 채택되기도 했습니다.

Python 3.3에서 모듈을 임포트할 때는 모듈 단위 잠금을 사용합니다. 이는 여러 스레드에서 특정 모듈을 임포트하는 과정을 올바르게 직렬화하여(불완전하게 초기화된 모듈이 노출되는 것을 방지함), 앞서 언급한 번거로움을 제거합니다.

(Antoine Pitrou가 bpo-9260 에서 기여).

내장 함수 및 타입

  • open() 에 새로운 opener 파라미터가 추가되었습니다. 파일 객체에 대한 기본 파일 디스크립터는 (file, flags)를 사용하여 opener 를 호출함으로써 얻어집니다. 이는 예를 들어 os.O_CLOEXEC 와 같은 사용자 정의 플래그를 사용하는 데 활용될 수 있습니다. 또한 독점 생성을 위한 'x' 모드가 추가되었으며, 파일이 이미 존재하는 경우 오류가 발생합니다.

  • print(): flush 키워드 인자가 추가되었습니다. flush 키워드 인수가 참이면 스트림이 강제로 플러시됩니다.

  • hash(): 해시 무작위화가 기본적으로 활성화됩니다. 자세한 내용은 object.__hash__()PYTHONHASHSEED 를 참조하십시오.

  • str 타입에 새로운 casefold() 메서드가 추가되었습니다. 문자열의 케이스폴드된 복사본을 반환하며, 대소문자 구분 없는 매칭에 사용할 수 있습니다. 예를 들어, 'ß'.casefold()'ss' 를 반환합니다.

  • 바이너리/텍스트 시퀀스 구분을 더 명확하게 설명하고 개별 내장 시퀀스 유형에 대한 전용 문서 섹션을 제공하기 위해 시퀀스 문서를 대폭 재작성했습니다. (bpo-4966)

새로운 모듈

faulthandler

This new debug module 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 faulthandler.enable() to install fault handlers for the SIGSEGV, SIGFPE, SIGABRT, SIGBUS, and SIGILL signals. You can also enable them at startup by setting the PYTHONFAULTHANDLER environment variable or by using -X faulthandler command line option.

리눅스에서 세그멘테이션 결함이 발생하는 예:

$ 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

새로운 ipaddress 모듈은 IPv4 및 IPv6 주소, 네트워크 및 인터페이스(즉, 특정 IP 서브넷과 연관된 IP 주소)를 나타내는 객체를 생성하고 조작하는 도구를 제공합니다.

(Google 및 Peter Moody가 PEP 3144 에서 기여).

lzma

새로 추가된 lzma 모듈은 LZMA 알고리즘을 사용하여 데이터를 압축 및 해제하며, .xz.lzma 파일 형식을 지원합니다.

(Nadeem Vawda와 Per Øyvind Karlsen이 bpo-6715 에서 기여).

개선된 모듈

abc

추상 메서드로 구성된 디스크립터를 포함하는 추상 베이스 클래스에 대한 지원을 개선했습니다. 이제 추상 디스크립터를 선언하는 권장 방식은 :attr:!__isabstractmethod__``를 동적으로 업데이트되는 속성으로 제공하는 것입니다. 내장 디스크립터도 이에 맞춰 업데이트되었습니다.

(Darren Dale이 bpo-11610 에서 기여).

abc.ABCMeta.register`이 이제 등록된 서브클래스를 반환하므로, 클래스 데코레이터로 사용할 있습니다. (:issue:`10868())

배열(array)

array 모듈이 qQ 타입 코드를 사용하여 long long 타입을 지원합니다.

(Oren Tirosh와 Hirokazu Yamamoto가 bpo-1172711 에서 기여했습니다.)

base64

이제 base64 현대적 인터페이스의 디코딩 함수에서 ASCII 전용 유니코드 문자열을 허용합니다. 예를 들어, base64.b64decode('YWJj')b'abc' 를 반환합니다. (Catalin Iacob가 bpo-13641 에서 기여했습니다.)

binascii

a2b_ 함수는 이제 기존에 지원하던 바이너리 객체 외에도 ASCII 전용 문자열을 입력으로 받아들입니다. (Antoine Pitrou가 bpo-13637 에서 기여했습니다.)

bz2

bz2 모듈이 처음부터 다시 작성되었습니다. 이 과정에서 몇 가지 새로운 기능이 추가되었습니다:

  • 새로운 bz2.open() 함수: bzip2로 압축된 파일을 바이너리 또는 텍스트 모드로 엽니다.

  • bz2.BZ2File 은 이제 생성자의 fileobj 인자를 통해 임의의 파일 유사 객체(file-like objects)에서 읽고 쓸 수 있습니다.

    (Nadeem Vawda가 bpo-5863 에서 기여했습니다.)

  • bz2.BZ2File and bz2.decompress() can now decompress multi-stream inputs (such as those produced by the pbzip2 tool). bz2.BZ2File can now also be used to create this type of file, using the 'a' (append) mode.

    (Nir Aides가 bpo-1625 에서 기여했습니다.)

  • bz2.BZ2File`은 이제 :meth:!detach` 및 truncate() 메서드를 제외한 모든 io.BufferedIOBase API를 구현합니다.

코덱

mbcs 코덱이 모든 Windows 버전에서 replaceignore 오류 처리기를 올바르게 처리하도록 재작성되었습니다. 이제 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 을 반환합니다.

(bpo-12016)

증분(Incremental) 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.' 를 반환합니다.

(bpo-12100)

unicode_internal 코덱이 폐지되었습니다.

컬렉션 모듈(collections)

여러 매핑을 하나의 단위로 취급할 수 있도록 새로운 ChainMap 클래스를 추가했습니다. (Raymond Hettinger가 bpo-11089 를 위해 작성하였으며, bpo-11297 에서 공개되었습니다.)

추상과 구체적인 컬렉션 클래스를 더 잘 구분하기 위해 추상 베이스 클래스들을 새로운 collections.abc 모듈로 이동했습니다. 기존 임포트를 유지하기 위해 ABC의 별칭은 여전히 collections 모듈에 남아 있습니다. (bpo-11085)

Counter 클래스가 이제 단항 연산자 +- 와 인플레이스(in-place) 연산자 +=, -=, |=, &= 를 지원합니다. (Raymond Hettinger가 bpo-13121 에서 기여했습니다.)

contextlib

nested` API와 달리, 새로운 API는 컨텍스트 관리자가 리소스를 `__init__` 메서드(예: 파일 객체) 또는 `__enter__` 메서드(예: threading 모듈의 동기화 객체)에서 획득하는지에 관계없이 올바르게 작동하도록 설계되었습니다.

(bpo-13585)

crypt

crypt 모듈에 솔트(salt), 모듈러 크립트 형식(해싱 방식) 및 mksalt() 함수가 추가되었습니다.

(bpo-10924)

curses

  • curses 모듈이 ncursesw 라이브러리에 연결된 경우, 유니코드 문자열이나 문자가 전달될 때 유니코드 함수(예: waddwstr())를 사용하고, 그렇지 않을 때는 바이트 함수(예: waddstr())를 사용하십시오.

  • 유니코드 문자열을 인코딩할 때 utf-8 대신 로캘 인코딩을 사용하십시오.

  • curses.window 에 새로운 curses.window.encoding 속성이 추가되었습니다.

  • curses.window 클래스에 와이드 캐릭터를 가져오는 새로운 get_wch() 메서드가 추가되었습니다.

  • curses 모듈에 와이드 캐릭터를 푸시하여 다음 get_wch() 가 이를 반환하도록 하는 새로운 unget_wch() 함수가 추가되었습니다.

(Iñigo Serna가 bpo-6755 에서 기여했습니다.)

datetime

decimal

bpo-7652 - 빠른 네이티브 십진 산술 통합.

Stefan Krah가 작성한 C 모듈 및 libmpdec.

새로운 decimal 모듈의 C 버전은 임의 정밀도의 올바른 반올림이 적용된 십진 부동 소수점 산술을 위해 고속 libmpdec 라이브러리를 통합합니다. libmpdec는 IBM의 일반 십진 산술 사양(General Decimal Arithmetic Specification)을 준수합니다.

성능 향상 폭은 데이터베이스 애플리케이션의 경우 10배에서 수치 집약적 애플리케이션의 경우 100배에 달합니다. 이 수치는 십진 부동 소수점 산술에서 사용되는 표준 정밀도에 대한 예상 성능 향상입니다. 정밀도는 사용자가 설정할 수 있으므로 정확한 수치는 달라질 수 있습니다. 예를 들어, 정수 bignum 산술의 경우 차이가 훨씬 더 클 수 있습니다.

다음 표는 예시입니다. 벤치마크 결과는 https://www.bytereef.org/mpdecimal/quickstart.html에서 확인 가능합니다.

decimal.py

_decimal

속도 향상

pi

42.02s

0.345s

120배

telco

172.19s

5.68s

30배

psycopg

3.57s

0.29s

12배

기능

  • FloatOperation 시그널은 float와 Decimal을 혼합할 때 선택적으로 더 엄격한 의미를 적용합니다.

  • Python이 스레드 없이 컴파일된 경우, C 버전은 비용이 많이 드는 스레드 로컬 컨텍스트 메커니즘을 자동으로 비활성화합니다. 이 경우 변수 HAVE_THREADSFalse 로 설정됩니다.

API 변경 사항

  • C 모듈은 머신 아키텍처에 따라 다음과 같은 컨텍스트 제한을 가집니다:

    32비트

    64비트

    MAX_PREC

    425000000

    999999999999999999

    MAX_EMAX

    425000000

    999999999999999999

    MIN_EMIN

    -425000000

    -999999999999999999

  • 컨텍스트 템플릿(DefaultContext, BasicContext, ExtendedContext)에서 EmaxEmin 의 크기가 999999 으로 변경되었습니다.

  • decimal.py의 Decimal 생성자는 컨텍스트 제한을 따르지 않으며 임의의 지수나 정밀도를 가진 값을 정확하게 변환합니다. C 버전은 내부 제한이 있으므로 다음 방식을 사용합니다: 가능하면 값을 정확하게 변환하고, 그렇지 않으면 InvalidOperation 이 발생하며 결과는 NaN이 됩니다. 후자의 경우 항상 create_decimal() 을 사용하여 반올림되거나 정확하지 않은 값을 얻을 수 있습니다.

  • decimal.py의 거듭제곱 함수는 항상 올바르게 반올림됩니다. C 버전에서는 exp()ln() 함수의 올바르게 반올림된 값으로 정의되지만, 최종 결과는 “거의 항상 올바르게 반올림”됩니다.

  • C 버전에서 시그널을 포함하는 컨텍스트 딕셔너리는 MutableMapping 입니다. 성능상의 이유로 flagstraps 는 항상 컨텍스트가 초기화될 때 사용된 동일한 MutableMapping 을 참조합니다. 새로운 시그널 딕셔너리가 할당되면 flagstraps 는 새 값으로 업데이트되지만, 우변(RHS)의 딕셔너리를 참조하지는 않습니다.

  • Context 를 피클링(pickling)할 때 Python과 C 버전 간의 공통 교환 형식을 갖도록 다른 출력을 생성합니다.

  • Context 생성자의 인자 순서가 repr() 에 표시되는 순서와 일치하도록 변경되었습니다.

  • quantize() 메서드의 watchexp 파라미터는 더 이상 사용되지 않습니다.

email

정책 프레임워크

email 패키지는 이제 policy 프레임워크를 포함합니다. Policy 는 email 패키지의 동작을 제어하는 여러 메서드와 프로퍼티를 가진 객체입니다. Python 3.3의 기본 정책은 Compat32 정책으로, 이는 Python 3.2 버전의 email 패키지와의 하위 호환성을 제공합니다. policyparser 에 의해 이메일 메시지가 파싱될 때나, Message 객체가 생성될 때, 또는 generator 를 사용하여 이메일이 직렬화될 때 지정할 수 있습니다. 재정의되지 않는 한, parser 에 전달된 정책은 해당 parser 에 의해 생성되는 모든 Message 객체와 하위 객체에 의해 상속됩니다. 기본적으로 generator 는 자신이 직렬화하는 Message 객체의 정책을 사용합니다. 기본 정책은 compat32 입니다.

모든 policy 객체가 구현하는 최소 제어 항목은 다음과 같습니다:

max_line_length

Message 가 직렬화될 때 각 줄이 가질 수 있는 최대 길이입니다(linesep 문자는 제외). 기본값은 78입니다.

linesep

Message 가 직렬화될 때 개별 줄을 구분하는 데 사용되는 문자입니다. 기본값은 \n 입니다.

cte_type

7bit 또는 8bit 입니다. 8bitBytes generator 에만 적용되며, 프로토콜이 허용하는 범위 내에서(또는 원본 입력에 존재하는 경우) 비-ASCII 문자가 사용될 수 있음을 의미합니다.

raise_on_defect

결함이 발견될 때 이를 Message 객체의 defects 리스트에 추가하는 대신, parser 가 오류를 발생시키도록 합니다.

새로운 설정이 적용된 새로운 정책 인스턴스는 정책 객체의 clone() 메서드를 사용하여 생성됩니다. clone``은 위의 제어 항목들을 키워드 인자로 받습니다. 호출 지정되지 않은 제어 항목은 기본값을 유지합니다. 따라서 다음과 같이 ``\r\n linesep 문자를 사용하는 정책을 생성할 수 있습니다:

mypolicy = compat32.clone(linesep='\r\n')

정책을 사용하면 애플리케이션에 필요한 형식으로 메시지를 생성하는 과정을 간소화할 수 있습니다. generator 를 호출하는 모든 곳에서 linesep='\r\n' 을 지정해야 하는 대신, 프로그램이 Message 객체를 생성하는 데 사용하는 parserMessage 에서 정책을 설정할 때 한 번만 지정하면 됩니다. 반면, 여러 형태의 메시지를 생성해야 하는 경우에는 적절한 generator 호출 시 파라미터를 직접 지정할 수도 있습니다. 또는 다양한 경우에 맞춰 사용자 정의 정책 인스턴스를 만들고 generator 를 생성할 때 이를 전달할 수도 있습니다.

새로운 헤더 API를 포함한 임시 정책

정책 프레임워크는 그 자체로도 가치가 있지만, 이를 도입한 주요 동기는 새로운 정책을 사용하지 않는 사용자들을 위해 하위 호환성을 유지하면서 이메일 패키지의 새로운 기능을 구현하는 신규 정책을 생성할 수 있게 하기 위함입니다. 새 정책이 새로운 API를 도입하므로, Python 3.3에서 provisional policy 로 출시됩니다. 핵심 개발자가 필요하다고 판단할 경우, 하위 호환성이 깨지는 변경 사항(코드 삭제 포함)이 발생할 수 있습니다.

새로운 정책은 EmailPolicy 의 인스턴스이며, 다음과 같은 추가 제어 항목을 제공합니다:

refold_source

parser 에 의해 파싱된 헤더를 generator 가 다시 접을지(refold) 여부를 결정합니다. 값으로 none, long, 또는 all 을 사용할 수 있습니다. 기본값은 long 이며, 이는 길이가 max_line_length 를 초과하는 원본 헤더의 줄이 다시 접히는 것을 의미합니다. none 은 어떤 줄도 다시 접지 않음을 의미하며, all 은 모든 줄을 다시 접는 것을 의미합니다.

header_factory

namevalue 를 인자로 받아 사용자 정의 헤더 객체를 생성하는 콜러블입니다.

header_factory 는 새로운 정책이 제공하는 핵심 기능입니다. 새 정책 중 하나를 사용하면 Message 객체에서 가져오는 모든 헤더는 header_factory 에 의해 생성된 객체가 되며, Message 에 헤더를 설정할 때도 `header_factory 가 생산한 객체로 변환됩니다. 이러한 모든 헤더 객체는 헤더 이름과 동일한 ` name 속성을 가집니다. Address 및 Date 헤더는 파싱된 데이터에 접근할 수 있는 추가 속성을 포함합니다. 즉, 이제 다음과 같은 작업을 수행할 수 있습니다:

>>> 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.headerdecode_header() 또는 make_header() 함수를 다룰 필요가 없어집니다.

또한 구성 요소를 사용하여 주소를 생성할 수 있습니다:

>>> 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>'

메시지를 파싱할 때 헤더 객체의 addressesgroups 속성을 사용하여 그룹과 개별 주소에 접근할 수 있습니다:

>>> 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'),))

요약하자면, 새 정책 중 하나를 사용하면 헤더 조작이 올바른 방식으로 작동합니다. 즉, 애플리케이션은 유니코드 문자열과 상호작용하고, email 패키지는 유니코드를 RFC 표준 콘텐츠 전송 인코딩으로 투명하게 변환 및 디코딩합니다.

기타 API 변경 사항

parser 모듈에 추가된 새로운 BytesHeaderParserHeaderParser 를 보완하고 Bytes API를 완성합니다.

새로운 유틸리티 함수:

ftplib

  • ftplib.FTP 클래스는 이제 나가는 소켓을 생성할 때의 bind 호출에서 소스 주소로 사용할 (host, port) 를 지정하는 source_address 키워드 인수를 수용합니다. (Giampaolo Rodolà가 bpo-8594 를 통해 기여)

  • FTP_TLS 클래스는 제어 채널을 일반 텍스트로 되돌리는 새로운 ccc() 함수를 제공합니다. 이는 고정된 포트를 열지 않고 비보안 FTP에 대한 NAT 처리를 지원하는 방화벽 환경에서 유용할 수 있습니다. (Giampaolo Rodolà가 bpo-12139 를 통해 기여)

  • 파싱 가능한 디렉터리 목록 형식을 제공하는 ftplib.FTP.mlsd() 메서드가 추가되었으며, 이로 인해 ftplib.FTP.nlst()ftplib.FTP.dir() 은 더 이상 권장되지 않습니다. (Giampaolo Rodolà가 bpo-11072 를 통해 기여)

functools

@functools.lru_cache 데코레이터가 이제 typed 키워드 인수를 지원합니다. (동일한 값으로 비교되는 서로 다른 타입의 값을 별도의 캐시 슬롯에 저장하도록 하기 위해 기본값은 False 로 설정됩니다. Raymond Hettinger가 bpo-13227 을 통해 기여)

gc

새로운 callbacks 리스트를 사용하여 가비지 컬렉션 전후에 호출될 콜백을 등록할 수 있습니다.

hmac

타이밍 분석을 통한 다이제스트의 사이드 채널 공격을 방지하기 위해 새로운 compare_digest() 함수가 추가되었습니다. (Nick Coghlan와 Christian Heimes가 bpo-15061 를 통해 기여)

http

http.server.BaseHTTPRequestHandler 가 이제 헤더를 버퍼링하고 end_headers() 이 호출될 때 한꺼번에 기록합니다. 누적된 헤더의 전송 시점을 직접 관리하려면 새로운 메서드인 flush_headers() 를 사용할 수 있습니다. (Andrew Schaaf가 bpo-3709 에서 기여함.)

http.server 가 이제 유효한 HTML 4.01 strict 출력을 생성합니다. (Ezio Melotti가 bpo-13295 에서 기여함.)

http.client.HTTPResponse 에 이제 readinto() 메서드가 추가되어 io.RawIOBase 클래스로 사용할 수 있습니다. (John Kuhn가 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.)

HTML5 명명된 문자 참조를 해당하는 유니코드 문자로 매핑하는 새로운 html5 딕셔너리(예: html5['gt;'] == '>')가 html.entities 모듈에 추가되었습니다. 이 딕셔너리는 이제 HTMLParser 에서도 사용됩니다. (Ezio Melotti가 bpo-11113, bpo-15156 에서 기여함.)

imaplib

IMAP4_SSL 생성자가 이제 보안 채널의 파라미터를 제어하기 위한 SSLContext 파라미터를 수용합니다.

(Sijin Joseph가 bpo-8808 에서 기여함.)

inspect

새로운 getclosurevars() 함수가 추가되었습니다. 이 함수는 함수 본문에서 참조되는 모든 이름의 현재 바인딩과 해당 이름이 해석된 위치를 보고하여, 상태 기반 클로저(stateful closure)에 의존하는 코드를 테스트할 때 내부 상태가 올바른지 확인하기 쉽게 해줍니다.

(Meador Inge와 Nick Coghlan이 bpo-13062 에서 기여함.)

새로운 getgeneratorlocals() 함수가 추가되었습니다. 이 함수는 제너레이터의 스택 프레임에 있는 로컬 변수의 현재 바인딩을 보고하여, 제너레이터를 테스트할 때 내부 상태가 올바른지 확인하기 쉽게 해줍니다.

(Meador Inge가 bpo-15153 에서 기여함.)

io

open() 함수에 새 파일만 전용으로 생성하고 이미 파일이 존재할 경우 FileExistsError 를 발생시키는 'x' 모드가 추가되었습니다. 이는 C11의 fopen() 에 대한 ‘x’ 모드를 기반으로 합니다.

(David Townshend가 bpo-12760 에서 기여함.)

TextIOWrapper 클래스의 생성자에 새로운 write_through 선택적 인자가 추가되었습니다. write_throughTrue 이면, write() 호출 시 버퍼링되지 않음이 보장됩니다. 즉, TextIOWrapper 객체에 작성된 모든 데이터가 즉시 하부의 바이너리 버퍼로 처리됩니다.

itertools

accumulate`가 이제 사용자가 제공하는 이항 함수를 위해 선택적인 ``func`() 인자를 받습니다.

logging

basicConfig() 함수가 이제 루트 로거에 추가할 핸서들의 반복 가능한(iterable) 객체를 받는 선택적 handlers 인자를 지원합니다.

SysLogHandler`에 클래스 수준 속성인 :attr:!append_nul`이 추가되었습니다. 일부 데몬에서는 필수적이고 다른 데몬에서는 로그로 그대로 전달되는 syslog 레코드의 NUL (\000) 바이트 추가 여부를 제어할 수 있습니다.

math

math 모듈에 x 의 밑이 2인 로그를 반환하는 새로운 함수 log2() 가 추가되었습니다.

(Mark Dickinson이 bpo-11888 에서 작성함.)

mmap

read() 메서드가 다른 파일 유사 객체와 더 호환되도록 변경되었습니다. 인자가 생략되거나 None 으로 지정된 경우, 현재 파일 위치부터 매핑 끝까지의 바이트를 반환합니다. (Petri Lehtinen가 bpo-12021 에서 기여함.)

multiprocessing

새로운 multiprocessing.connection.wait() 함수는 타임아웃과 함께 여러 객체(연결, 소켓 및 파이프 등)를 폴링할 수 있게 해줍니다. (Richard Oudkerk가 bpo-12328 에서 기여함.)

multiprocessing.connection.Connection 객체를 이제 멀티프로세싱 연결을 통해 전송할 수 있습니다. (Richard Oudkerk가 bpo-4892 에서 기여함.)

multiprocessing.Process`가 이제 부모 프로세스의 ``daemon` 플래그를 상속받는 기본 동작을 재정의하기 위해 daemon 키워드 인자를 수용합니다 (bpo-6064).

새로운 속성 multiprocessing.Process.sentinel 을 사용하면 프로그램이 적절한 OS 프리미티브(예를 들어, POSIX 시스템의 select)를 사용하여 여러 개의 Process 객체를 동시에 기다릴 수 있습니다.

새로운 메서드 multiprocessing.pool.Pool.starmap()starmap_async() 는 기존의 multiprocessing.pool.Pool.map()map_async() 함수에 대한 itertools.starmap() 와 동일한 기능을 제공합니다. (Hynek Schlawack가 bpo-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à가 bpo-9795 에서 기여함.)

os

  • os 모듈에 pipe2() 함수가 추가되어, O_CLOEXEC 또는 O_NONBLOCK 플래그를 원자적으로 설정하여 파이프를 생성할 수 있게 되었습니다. 이는 멀티스레드 프로그램에서 레이스 컨디션을 방지하는 데 특히 유용합니다.

  • os 모듈에 한 파일(또는 소켓) 설명자에서 다른 쪽으로 데이터를 효율적으로 복사하는 “제로 카피(zero-copy)” 방식의 sendfile() 함수가 추가되었습니다. “제로 카피”라는 용어는 두 설명자 사이의 모든 데이터 복사가 유저 공간 버퍼로의 복사 없이 커널에 의해 전적으로 수행됨을 의미합니다. sendfile() 은 파일 다운로드와 같이 디스크의 파일을 네트워크 소켓으로 효율적으로 복사하는 데 사용될 수 있습니다.

    (Ross Lagerwall과 Giampaolo Rodolà가 bpo-10882 에서 패치를 제출함.)

  • 심볼릭 링크 공격이나 임시 파일 및 디렉토리 관련 문제를 방지하기 위해, 파일 이름 대신 파일 기술자를 조작하는 것이 더 안정적이며(동시에 더 빠릅니다). Python 3.3은 기존 함수를 개선하고 파일 기술자를 다루는 새 함수들을 도입합니다 (bpo-4761, bpo-10755bpo-14626).

  • access`가 액세스 확인 실제 uid/gid 대신 유효한(effective) uid/gid를 사용하도록 하는 ``effective_ids`() 키워드 인자를 수용합니다. 이 기능에 대한 플랫폼 지원 여부는 supports_effective_ids 세트를 통해 확인할 수 있습니다.

  • os 모듈에 두 개의 새로운 함수인 getpriority()setpriority() 가 추가되었습니다. 이들은 os.nice() 와 유사한 방식으로 프로세스의 우선순위(niceness)를 가져오거나 설정할 수 있으며, 현재 프로세스뿐만 아니라 모든 프로세스에 대해 적용됩니다.

    (Giampaolo Rodolà가 bpo-10784 에서 패치를 제출함.)

  • 새로운 os.replace() 함수는 목적지를 덮어쓰면서 파일 이름을 변경하는 기능을 크로스 플랫폼에서 지원합니다. os.rename() 의 경우 POSIX에서는 기존에 존재하는 대상 파일을 덮어쓰지만, Windows에서는 오류를 발생시킵니다. (Antoine Pitrou가 bpo-8828 에서 기여함.)

  • stat 관련 함수들(stat(), fstat(), lstat())은 이제 나노초 정밀도로 파일 타임스탬프를 읽는 것을 지원합니다. 대칭적으로, utime() 은 이제 나노초 정밀도로 파일 타임스탬프를 기록할 수 있습니다. (Larry Hastings가 bpo-14127 에서 기여함.)

  • 새로운 os.get_terminal_size() 함수는 파일 기술자에 연결된 터미널의 크기를 조회합니다. 또한 shutil.get_terminal_size() 를 참조하십시오. (Zbigniew Jędrzejewski-Szmek가 bpo-13609 에서 기여함.)

  • 리눅스 확장 어트리뷰트(extended attributes)를 지원하기 위한 새 함수들이 추가되었습니다 (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 가 임의의 버퍼 시퀀스인 경우, 그 내용을 파일 기술자에 씁니다.

    • getgrouplist() (bpo-9344): 지정된 사용자가 속한 그룹 ID 목록을 반환합니다.

  • times()uname(): 반환 타입이 튜플에서 이름이 지정된 속성을 가진 튜플과 유사한 객체로 변경되었습니다.

  • 일부 플랫폼에서 이제 os.SEEK_HOLEos.SEEK_DATA 와 같은 lseek() 함수의 추가 상수를 지원합니다.

  • 새로운 상수 RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTLD_NOLOAD, 및 RTLD_DEEPBIND 를 지원하는 플랫폼에서 사용할 수 있습니다. 이 상수들은 sys.setdlopenflags() 함수에서 사용되며, ctypesDLFCN 에 정의된 유사한 상수를 대체합니다. (Victor Stinner가 bpo-13226 에서 기여함.)

  • os.symlink`은 이제 교차 플랫폼 지원을 용이하게 하기 위해 Windows 이외의 플랫폼에서 ``target_is_directory`() 키워드 인수를 수용하고(무시함) 처리합니다.

pdb

탭 완성 기능이 이제 명령 이름뿐만 아니라 그 인자에서도 가능합니다. 예를 들어, break 명령의 경우 함수 및 파일 이름이 자동 완성됩니다.

(Georg Brandl가 bpo-14210 에서 기여함)

pickle

pickle.Pickler 객체에 이제 필터별 환원(reduction) 함수를 설정할 수 있는 선택적 dispatch_table 속성이 추가되었습니다.

(Richard Oudkerk가 bpo-14166 에서 기여함.)

pydoc

pydoc 모듈에서 Tk GUI 및 serve() 함수가 제거되었습니다. pydoc -gserve() 는 Python 3.2부터 사용이 중단(deprecated)되었습니다.

re

str 정규 표현식이 이제 \u\U 이스케이프를 지원합니다.

(Serhiy Storchaka가 bpo-3665 에서 기여함.)

sched

  • run() 이 이제 blocking 파라미터를 수용하며, 이를 false로 설정하면 가장 빨리 만료되는 예약된 이벤트(있는 경우)를 실행한 후 즉시 반환합니다. 이는 비차단(non-blocking) 애플리케이션에서 scheduler 를 사용하고자 할 때 유용합니다. (Giampaolo Rodolà가 bpo-13449 에서 기여함.)

  • scheduler 클래스를 이제 다중 스레드 환경에서 안전하게 사용할 수 있습니다. (Josiah Carlson 및 Giampaolo Rodolà가 bpo-8684 에서 기여함.)

  • scheduler 클래스 생성자의 timefuncdelayfunct 파라미터가 이제 선택 사항이며 각각 time.time()time.sleep() 을 기본값으로 사용합니다. (Chris Clark가 bpo-13245 에서 기여함.)

  • enter()enterabs()argument 파라미터가 이제 선택 사항입니다. (Chris Clark가 bpo-13245 에서 기여함.)

  • enter()enterabs() 가 이제 kwargs 파라미터를 수용합니다. (Chris Clark가 bpo-13245 에서 기여함.)

select

Solaris 및 파생 플랫폼에 /dev/poll 을 통한 고성능 비동기 소켓용 새 클래스인 select.devpoll 이 추가되었습니다. (Jesús Cea Avión이 bpo-6397 에서 기여함.)

shlex

pipes 모듈의 문서화되지 않았던 도움 함수 quoteshlex 모듈로 이동되고 문서화되었습니다. quote() 는 셸에서 특별한 의미로 해석될 수 있는 문자열 내의 모든 문자를 적절히 이스케이프합니다.

shutil

  • 새로운 함수들:

    • disk_usage(): 전체, 사용 중인, 여유 디스크 공간 통계를 제공합니다. (Giampaolo Rodolà가 bpo-12442 에서 기여함.)

    • chown(): 주어진 경로의 사용자 및/또는 그룹을 변경할 수 있으며, 숫자 ID뿐만 아니라 사용자/그룹 이름을도 지정할 수 있습니다. (Sandro Tosi가 bpo-12191 에서 기여함.)

    • shutil.get_terminal_size(): 인터프리터가 연결된 터미널 창의 크기를 반환합니다. (Zbigniew Jędrzejewski-Szmek이 bpo-13609 에서 기여함.)

  • copy2()copystat() 은 이제 이를 지원하는 플랫폼에서 나노초 정밀도로 파일 타임스탬프를 유지합니다. 또한 Linux 환경에서는 파일의 “확장 속성(extended attributes)”도 보존합니다. (Larry Hastings가 bpo-14127bpo-15238 에서 기여함.)

  • 여러 함수가 선택적 symlinks 인수를 취합니다. 이 파라미터가 참이면 심볼릭 링크를 참조하지 않고 대신 심볼릭 링크 자체에 대해 작업을 수행하며(해당하는 경우 생성함), 이를 지원합니다. (Hynek Schlawack가 bpo-12715 에서 기여함.)

  • 다른 파일 시스템으로 파일을 복사할 때, move() 는 이제 타겟 파일 내용을 복사하는 대신 심볼릭 링크를 다시 생성함으로써 POSIX mv 명령과 동일한 방식으로 처리합니다. (Jonathan Niehof가 bpo-9993 에서 기여함.) 또한 move() 는 이제 결과값으로 dst 인수를 반환합니다.

  • rmtree() 는 이제 os.open()os.unlink() 에서 새로운 dir_fd 파라미터를 지원하는 플랫폼에서 심볼릭 링크 공격에 견딜 수 있습니다. (Martin von Löwis 및 Hynek Schlawack이 bpo-4489 에서 기여함.)

신호(signal)

  • signal 모듈에 새로운 함수들이 추가되었습니다:

  • 시그널 처리기는 웨이크업 파일 기술자에 널 바이트 대신 시그널 번호를 단일 바이트로 기록합니다. 따라서 하나 이상의 시그널을 기다릴 수 있으며 어떤 시그널이 발생했는지 알 수 있습니다.

  • signal.signal()signal.siginterrupt() 는 이제 RuntimeError 대신 OSError를 발생시킵니다. (OSError는 errno 속성을 포함합니다.)

smtpd

smtpd 모듈이 이제 RFC 5321 (확장 SMTP) 및 RFC 1870 (크기 확장)을 지원합니다. 표준에 따라, 이러한 확장은 클라이언트가 EHLO 명령으로 세션을 시작할 때만 활성화됩니다.

(초기 ELHO 지원은 Alberto Trevino가, 크기 확장은 Juhana Jauhiainen이 담당했습니다. 추가적인 상당 부분의 작업은 Michele Orrù와 Dan Boswell이 기여한 패치로 이루어졌습니다. bpo-8739)

smtplib

SMTP, SMTP_SSL, 및 LMTP 클래스는 이제 나가는 소켓을 생성할 때 bind 호출에서 소스 주소로 사용할 (host, port) 를 지정하는 source_address 키워드 인수를 수용합니다. (Paulo Scardine이 bpo-11281 에서 기여함.)

SMTP 은 이제 컨텍스트 관리 프로토콜을 지원하여 SMTP 인스턴스를 with 문에서 사용할 수 있습니다. (Giampaolo Rodolà가 bpo-11289 에서 기여함.)

SMTP_SSL 생성자와 starttls() 메서드가 이제 보안 채널의 매개변수를 제어하기 위한 SSLContext 파라미터를 수용합니다. (Contributed by Kasun Herath in bpo-8809.)

socket

socketserver

BaseServer 는 이제 서비스 루프 내의 serve_forever() 메서드에 의해 호출되는 재정의 가능한 메서드 service_actions() 를 가집니다. ForkingMixIn 은 이제 이를 사용하여 좀비 자식 프로세스를 정리합니다. (Contributed by Justin Warkentin in bpo-11109.)

sqlite3

새로운 sqlite3.Connection 메서드인 (Contributed by Torsten Landschoff in :issue:`11688().)

ssl

  • ssl 모듈에 두 개의 새로운 무작위 생성 함수가 추가되었습니다:

    • RAND_bytes(): 암호학적으로 강력한 의사 난수 바이트를 생성합니다.

    • RAND_pseudo_bytes(): 의사 난수 바이트를 생성합니다.

    (Contributed by Victor Stinner in bpo-12049.)

  • ssl 모듈이 이제 다양한 종류의 오류를 더 쉽게 검사할 수 있도록 세분화된 예외 계층 구조를 노출합니다. (Contributed by Antoine Pitrou in bpo-11183.)

  • (Contributed by Adam Simpkins in :issue:`12803().)

  • 일반 및 타원 곡선 기반 Diffie-Hellman 키 교환이 이제 load_dh_params()set_ecdh_curve() 메서드를 통해 지원됩니다. (Contributed by Antoine Pitrou in bpo-13626 and bpo-13627.)

  • SSL 소켓에 SCRAM-SHA-1-PLUS와 같은 특정 인증 메커니즘을 구현할 수 있도록 하는 새로운 get_channel_binding() 메서드가 추가되었습니다. (Contributed by Jacek Konieczny in bpo-12551.)

  • 새로운 compression() 메서드를 통해 SSL 소켓에서 사용되는 SSL 압축 알고리즘을 조회할 수 있습니다. 새로운 어트리뷰트 (Contributed by Antoine Pitrou in :issue:`13634.)

  • ssl.SSLContext.set_npn_protocols() 메서드를 사용하여 Next Protocol Negotiation 확장 기능을 지원하게 되었습니다. (Contributed by Colin Marc in bpo-14204.)

  • libraryreason 어트리뷰트 덕분에 이제 SSL 오류를 더 쉽게 조사할 수 있습니다. (Contributed by Antoine Pitrou in bpo-14837.)

  • get_server_certificate() 함수가 이제 IPv6를 지원합니다. (Contributed by Charles-François Natali in bpo-11811.)

  • 새로운 어트리뷰트 (:issue:`13635)

stat

문서화되지 않은 tarfile.filemode 함수가 stat.filemode() 로 이동되었습니다. 이 함수는 파일의 모드를 ‘-rwxrwxrwx’ 형태의 문자열로 변환하는 데 사용될 수 있습니다.

(Contributed by Giampaolo Rodolà in bpo-14807.)

struct

struct 모듈이 이제 새로운 코드 nN 을 통해 각각 ssize_tsize_t 를 지원합니다. (Contributed by Antoine Pitrou in bpo-3163.)

subprocess

POSIX 플랫폼에서 명령 문자열이 이제 바이트(bytes) 객체일 수 있습니다. (Contributed by Victor Stinner in bpo-8513.)

새로운 상수 (Contributed by Ross Lagerwall in :issue:`5870.)

sys

The sys module has a new thread_info named tuple holding information about the thread implementation (bpo-11223).

타르파일

tarfile now supports lzma encoding via the lzma module. (Contributed by Lars Gustäbel in bpo-5689.)

tempfile

tempfile.SpooledTemporaryFile`의 :meth:!truncate` 메서드가 이제 size 파라미터를 수용합니다. (Contributed by Ryan Kelly in bpo-9957.)

textwrap

textwrap 모듈에 텍스트 블록 내에서 선택한 줄에 공통 접두사를 쉽게 추가할 수 있는 새로운 (:issue:`13857())

threading

threading.Condition, threading.Semaphore, threading.BoundedSemaphore, threading.Event, 및 threading.Timer`는 기존에 클래스 인스턴스를 반환하는 팩토리 함수였으나, 이제 모두 클래스로 변경되어 하위 클래스를 정의할 있습니다. (Contributed by Éric Araujo in :issue:`10968.)

threading.Thread 생성자가 이제 부모 스레드의 daemon 플래그 값을 상속하는 기본 동작을 덮어쓰기 위해 daemon 키워드 인자를 수용합니다. (bpo-6064)

이전에 비공개(private)였던 기능인 _thread.get_ident 가 이제 공개 함수인 threading.get_ident() 으로 사용 가능해졌습니다. 이를 통해 표준 라이브러리 내에서 _thread 모듈에 직접 접근하는 여러 사례를 제거했습니다. _thread.get_ident 을 사용하던 타사 코드도 새로운 공용 인터페이스를 사용하도록 변경되어야 합니다.

time

PEP 418time 모듈에 새로운 함수들을 추가했습니다:

  • get_clock_info(): 시계(clock)에 대한 정보를 가져옵니다.

  • monotonic(): 단조 시계(뒤로 가지 않음), 시스템 시계 업데이트의 영향을 받지 않습니다.

  • perf_counter(): 짧은 기간을 측정하기 위해 가장 높은 해상도를 제공하는 성능 카운터입니다.

  • process_time(): 현재 프로세스의 시스템 및 사용자 CPU 시간의 합계입니다.

기타 새로운 기능:

교차 플랫폼 일관성을 개선하기 위해, sleep() 은 이제 음수 대기 값이 전달되면 ValueError 를 발생시킵니다. 이전에는 POSIX에서 오류가 발생했으나, Windows에서는 무한정 대기 상태에 빠졌습니다.

types

types.MappingProxyType 클래스를 추가했습니다: 매핑(mapping)의 읽기 전용 프록시입니다. (bpo-14386)

새로운 기능인 types.new_class()types.prepare_class`는 :pep:`3115`를 준수하는 동적 타입 생성을 지원합니다. (:issue:`14588())

unittest

assertRaises(), assertRaisesRegex(), assertWarns(), 및 assertWarnsRegex`가 컨텍스트 매니저로 사용될 이제 키워드 인자 *msg*를 수용합니다. (Contributed by Ezio Melotti and Winston Ewert in :issue:`10775().)

unittest.TestCase.run() 이 이제 TestResult 객체를 반환합니다.

urllib

Request 클래스가 이제 어떤 HTTP 메서드를 사용할지 결정하는 예를 들어, 이를 통해 `()’HEAD’`` 요청을 보낼 수 있습니다:

>>> urlopen(Request('https://www.python.org', method='HEAD'))

(bpo-1673007)

웹 브라우저

The webbrowser module supports more “browsers”: Google Chrome (named chrome, chromium, chrome-browser or chromium-browser depending on the version and operating system), and the generic launchers xdg-open, from the FreeDesktop.org project, and gvfs-open, which is the default URI handler for GNOME 3. (The former contributed by Arnaud Calmettes in bpo-13620, the latter by Matthias Klose in bpo-14493.)

xml.etree.ElementTree

xml.etree.ElementTree 모듈이 이제 기본적으로 C 가속기를 가져옵니다. 따라서 더 이상 xml.etree.cElementTree 를 명시적으로 임포트할 필요가 없습니다 (해당 모듈은 하위 호환성을 위해 유지되지만, 이제 사용 중단(deprecated)되었습니다). 또한, Elementiter 메서드 계열이 최적화되었으며(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배 더 빨라졌습니다.

    (Contributed by Serhiy Storchaka, bpo-14624, bpo-14738bpo-15026.)

빌드 및 C API 변경 사항

Python 빌드 프로세스 및 C API의 변경 사항은 다음과 같습니다:

폐지됨

지원되지 않는 운영 체제

유지 관리자가 없어 OS/2 및 VMS를 더 이상 지원하지 않습니다.

유지 관리 부담으로 인해 Windows 2000 및 COMSPECcommand.com 으로 설정하는 Windows 플랫폼을 더 이상 지원하지 않습니다.

3.2에서 폐지된 OSF 지원이 완전히 제거되었습니다.

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

C API의 폐지된 함수 및 타입

Py_UNICODEPEP 393 에 의해 폐지되었으며 파이썬 4에서 제거될 예정입니다. 이 타입을 사용하는 모든 함수가 폐지되었습니다:

Py_UNICODEPy_UNICODE* 유형을 사용하는 유니코드 함수 및 메서드:

Py_UNICODE* 문자열을 조작하는 함수 및 매크로:

인코더:

폐지된 기능

array 모듈의 'u' 형식 코드는 이제 폐지되었으며, 파이썬 4에서 나머지 (Py_UNICODE) API와 함께 제거될 예정입니다.

파이썬 3.3으로 이식하기

이 섹션은 이전에 설명된 변경 사항과 코드를 수정해야 할 수도 있는 기타 버그 수정을 나열합니다.

파이썬 코드 이식하기

  • 해시 무작위화가 기본적으로 활성화되어 있습니다. 해시 무작위화를 비활성화하려면 PYTHONHASHSEED 환경 변수를 0 으로 설정하십시오. 또한 object.__hash__() 메서스를 참조하십시오.

  • bpo-12326: 리눅스에서 sys.platform 은 더 이상 주요 버전을 포함하지 않습니다. 파이썬을 빌드하는 데 사용된 리눅스 버전에 따라 linux2 또는 linux3 가 아닌 항상 ‘linux’로 표시됩니다. sys.platform == ‘linux2’sys.platform.startswith(‘linux’) 로 교체하거나, 이전 버전의 파이썬을 지원할 필요가 없다면 직접 sys.platform == ‘linux’ 로 사용하십시오.

  • bpo-13847, bpo-14180: time and datetime: OverflowError is now raised instead of ValueError if a timestamp is out of range. OSError is now raised if C functions gmtime() or localtime() failed.

  • 임포트에서 사용하는 기본 파인더는 이제 특정 디렉터리 내에 포함된 내용의 캐시를 활용합니다. 파이썬 소스 파일이나 소스가 없는 바이트코드 파일을 생성하는 경우, 파인더가 새 파일을 인식할 수 있도록 캐시를 비우기 위해 importlib.invalidate_caches() 를 호출해야 합니다.

  • ImportError 는 이제 시도된 모듈의 전체 이름을 사용합니다. ImportError 메시지를 확인하는 도크테스트(doctest)는 이름의 끝부분 대신 전체 모듈 이름을 사용하도록 업데이트해야 합니다.

  • __import__()index 인자는 이제 -1이 아닌 0을 기본값으로 하며 더 이상 음수 값을 지원하지 않습니다. PEP 328 구현 당시 기본값이 -1로 유지된 것은 실수였습니다. 상대 임포트 후 절대 임포트를 수행해야 하는 경우, 인덱스 1을 사용하여 상대 임포트를 수행한 다음 인덱스 0을 사용하여 다른 임포트를 수행하십시오. 하지만 __import__() 를 직접 호출하는 대신 importlib.import_module() 을 사용하는 것이 권장됩니다.

  • __import__() 은 더 이상 최상위 모듈에 대해 0 이외의 인덱스 값을 사용하는 것을 허용하지 않습니다. 예: __import__('sys', level=1) 는 이제 오류입니다.

  • sys.meta_pathsys.path_hooks 에 기본적으로 파인더가 존재하므로, 해당 리스트에 항목을 추가할 때 list.append() 대신 list.insert() 를 사용하는 것이 좋습니다.

  • None 이 이제 sys.path_importer_cache 에 삽입되므로, 파인더가 없는 경로의 딕셔너리 항목을 정리할 때 하위 호환성을 유지하려면 Noneimp.NullImporter 와 쌍을 이루는 키를 모두 제거해야 합니다. 이는 암시적 파인더의 사용을 나타내는 Nonesys.path_importer_cache 에 다시 삽입하는 이전 버전의 파이썬에서 추가적인 오버헤드를 발생시키지만, 의미론적으로는 아무것도 변경하지 않습니다.

  • importlib.abc.Finder 는 더 이상 구현해야 하는 find_module() 추상 메서드를 명시하지 않습니다. 하위 클래스가 해당 메서드를 구현하는 것에 의존했다면, 먼저 메서드의 존재 여부를 확인하십시오. 특히 path entry finders 를 사용하는 경우, 아마도 find_loader() 를 먼저 확인해야 할 것입니다.

  • pkgutil 이 내부적으로 importlib 을 사용하도록 변경되었습니다. 이를 통해 기존의 PEP 302 임포트 에뮬레이션 동작이 실제 임포트 시스템과 일치하지 않았던 많은 예외 케이스가 해결되었습니다. 임포트 에뮬레이션 자체는 여전히 존재하지만 현재는 폐지된 상태입니다. 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 에서 poplib.error_proto 오류가 발생하지 않는다고 가정하는 코드는 특정 애플리케이션에서 quit 중 오류가 발생할 경우 수정이 필요할 수 있습니다 (bpo-11291).

  • Python 2.4부터 사용 중단된 email.parser.Parser`의 ``strict` 인수가 마침내 제거되었습니다.

  • 사용이 중단된 메서드 unittest.TestCase.assertSameElements 가 제거되었습니다.

  • 사용이 중단된 변수 time.accept2dyear 가 제거되었습니다.

  • 사용이 중단된 Context._clamp 속성이 decimal 모듈에서 제거되었습니다. 이 속성은 이전에 공개 속성인 (참조: :issue:`8540.)

  • socket.socket.makefile() 이 오래전부터 해당 기능을 직접 제공해 왔으므로, 문서화되지 않은 내부 헬퍼 클래스인 SSLFakeFilesmtplib 에서 제거되었습니다.

  • Windows에서 time.sleep() 에 음수 값을 전달할 경우 이제 무한정 대기하는 대신 오류를 발생시킵니다. 포릭스(posix) 시스템에서는 항상 오류를 발생시켜 왔습니다.

  • ast.__version__ 상수가 제거되었습니다. AST 버전에 영향을 받는 결정을 내려야 하는 경우 sys.version_info 를 사용하여 판단하십시오.

  • threading 모듈이 비공개 클래스를 상속하여 팩토리 함수를 사용하던 사실을 우회하기 위해 작성된 코드는 이제 공개된 클래스를 상속하도록 변경해야 합니다.

  • threading 모듈의 문서화되지 않은 디버깅 매커니즘이 제거되어 코드가 단순해졌습니다. 이는 운영 환경 코드에 영향을 주지 않아야 하지만, 특정 애플리케이션 디버그 프레임워크가 이와 상호작용하고 있을 경우를 대비하여 언급합니다 (bpo-13550).

C 코드 포팅

  • 버퍼 API 변경 과정에서 문서화되지 않은 smalltable 멤버가 Py_buffer 구조체에서 제거되었으며, PyMemoryViewObject 의 레이아웃이 변경되었습니다.

    memoryobject.h 또는 object.h 의 관련 부분을 사용하는 모든 확장 모듈을 다시 빌드해야 합니다.

  • PEP 393 으로 인해 Py_UNICODE 타입과 이 타입을 사용하는 모든 함수가 사용 중단(deprecated)되었습니다 (최소 5년 동안은 계속 사용할 수 있습니다). 유니코드 객체를 생성하고 액세스하기 위해 로우레벨 유니코드 API를 사용하던 중이며 PEP 393 이 제공하는 메모리 점유율 감소 혜택을 받으려면 코드를 새로운 Unicode API 로 변환해야 합니다.

    그러나 PyUnicode_Concat(), PyUnicode_Join() 또는 PyUnicode_FromFormat() 과 같은 하이레벨 함수만 사용해 왔다면, 귀하의 코드는 새로운 유니코드 표현 방식을 자동으로 활용하게 됩니다.

  • PyImport_GetMagicNumber() 이 이제 실패 시 -1 을 반환합니다.

  • __import__()level 인자에 음수 값이 더 이상 유효하지 않게 됨에 따라, PyImport_ImportModuleLevel() 도 동일하게 적용됩니다. 이는 또한 PyImport_ImportModuleEx() 에서 사용되는 level 값이 이제 -1 대신 0 임을 의미합니다.

C 확장 빌드하기

  • C 확장 모듈의 가능한 파일명 범위가 제한되었습니다. 거의 사용되지 않는 명칭이 제거되었습니다: POSIX 환경에서 xxxmodule.so, xxxmodule.abi3.soxxxmodule.cpython-*.so``라는 이름의 파일은 이상 ``xxx 모듈을 구현하는 것으로 인식되지 않습니다. 이러한 파일을 생성해 왔다면 다른 표기법으로 전환해야 합니다(즉, 파일명에서 module 문자열을 제거하십시오).

    (bpo-14040 에서 구현됨.)

명령 줄 스위치 변경 사항

  • -Q 명령 줄 플래그와 관련 요소들이 제거되었습니다. sys.flags.division_warning을 확인하는 코드는 업데이트가 필요합니다.

    (bpo-10998, Éric Araujo 기여)

  • python-S 로 시작할 때, import site 가 더 이상 모듈 검색 경로에 사이트별 경로를 추가하지 않습니다. 이전 버전에서는 추가되었습니다.

    (bpo-11591, Carl Meyer 기여, Éric Araujo 편집)

분실물 보관소