Python

파이썬 2.7의 새로운 기능

저자:

A.M. Kuchling (amk at amk.ca)

이 문서는 Python 2.7의 새로운 기능에 대해 설명합니다. Python 2.7은 2010년 7월 3일에 출시되었습니다.

부동소수점 숫자와 Decimal 클래스를 위해 많은 방식으로 수치 처리가 개선되었습니다. 표준 라이브러리에는 크게 향상된 unittest 모듈, 명령줄 옵션 파싱을 위한 argparse 모듈, collections 모듈의 편리한 OrderedDictCounter 클래스 등 유용한 추가 기능들이 있습니다.

Python 2.7은 2.x 버전의 마지막으로 계획되어 있어, 저희는 장기적인 관점에서 좋은 출판본이 되도록 노력했습니다. Python 3으로 마이그레이션하는 데 도움을 주기 위해, Python 3.x 시리즈의 여러 새로운 기능들이 2.7에 포함되었습니다.

이 문서는 새로운 기능 전체 명세를 제공하려는 것이 아니라, 편리한 개요를 제공합니다. 전체 세부 내용은 https://docs.python.org에서 Python 2.7에 대한 설명서를 참조해 주십시오. 설계 및 구현의 근거를 이해하려면 특정 새 기능에 대한 PEP 또는 변경 사항이 논의된 https://bugs.python.org 의 이슈를 참고하십시오. 가능할 때마다, “Python의 새로운 기능”은 각 변경 사항에 대한 버그/패치 항목으로 링크됩니다.

Python 2.x의 미래

Python 개발자들은 새로운 기능 개발 노력을 Python 3.x 시리즈로 옮겼기 때문에, Python 2.7은 2.x 시리즈의 마지막 주요 버전입니다. 이는 Python 2가 버그 수정 및 지원되는 운영 체제의 새 하드웨어와 버전을 기준으로 올바르게 빌드하기 위한 업데이트를 계속 받겠지만, 언어나 표준 라이브러리에 새로운 전체 기능 출시가 없을 것임을 의미합니다.

하지만 Python 2.7과 Python 3 사이에는 많은 공통 부분의 집합이 존재하며, 이 공통 부분으로 마이그레이션하거나 Python 3로 직접 마이그레이션하는 과정에서 수반되는 많은 변경 사항들은 안전하게 자동화될 수 있지만, 일부 다른 변경 사항(특히 유니코드 처리와 관련된 것)은 효과적인 마이그레이션을 위해 신중한 고려가 필요하며, 가급적 강력한 자동 회귀 테스트 스위트가 필요할 수 있습니다.

이는 Python 2.7이 오랫동안 유지되어 서비스를 제공한다는 의미이며, 아직 Python 3으로 포팅되지 않은 프로덕션 시스템을 위해 안정적이고 지원되는 기본 플랫폼을 제공합니다. Python 2.7 시리즈의 예상 전체 수명 주기는 :pep:`373`에 자세히 설명되어 있습니다.

2.7이 갖는 장기적인 중요성의 몇 가지 주요 결과는 다음과 같습니다:

  • 앞서 언급했듯이, 2.7은 이전의 2.x 버전들과 비교하여 훨씬 더 긴 유지보수 기간을 가집니다. Python 2.7은 현재 코어 개발 팀으로부터 (보안 업데이트 및 기타 버그 수정 받으며) 적어도 2020년까지 지원받을 것으로 예상됩니다 (이는 일반적인 지원 기간인 18~24개월에 비해 최초 출시 후 10년입니다).

  • 파이썬 2.7 표준 라이브러리가 오래됨에 따라 Python Package Index (직접 또는 재배포기 사용을 통해)를 효과적으로 사용하는 것이 Python 2 사용자들에게 더욱 중요해졌습니다. 다양한 작업을 위한 방대한 제3자 패키지 외에도, 이용 가능한 패키지에는 Python 2와 호환되는 Python 3 표준 라이브러리의 새로운 모듈 및 기능에 대한 백포트(backports)뿐만 아니라, Python 3으로의 마이그레이션을 더 쉽게 할 수 있도록 해주는 다양한 도구와 라이브러리가 포함되어 있습니다. Python Packaging User Guide 는 Python Package Index에서 소프트웨어를 다운로드 및 설치하는 과정에 대한 안내를 제공합니다.

  • 파이썬 2를 향상시키는 선호되는 접근 방식은 현재 Python Package Index에 새로운 패키지를 게시하는 것이지만, 이 접근 방식이 모든 경우에 반드시 통하는 것은 아니며, 특히 네트워크 보안과 관련된 경우 더욱 그렇습니다. PyPI에 새롭거나 업데이트된 패키지를 게시하여 적절하게 처리할 수 없는 예외적인 경우에는, Python Enhancement Proposal 프로세스를 사용하여 Python 2 표준 라이브러리에 새로운 기능을 추가해야 할 주장을 펼칠 수 있습니다. 이러한 추가 사항들과 그리고 해당 기능이 추가되었던 유지보수 버전들은 아래의 Python 2.7 유지보수 릴리스에 추가된 새로운 기능 섹션에 기록될 것입니다.

Python 2에서 Python 3으로 마이그레이션을 원하거나, 또는 Python 2와 Python 3 사용자 모두를 지원하려는 라이브러리 및 프레임워크 개발자를 위해 적절한 접근 방식을 결정하고 관련 기술적 세부 사항을 관리하는 데 도움을 줄 수 있는 다양한 도구와 가이드가 있습니다. 권장되는 시작점은 파이썬 2 코드를 파이썬 3으로 이식하는 법 HOWTO 가이드입니다.

폐지 경고 처리 변경 사항

Python 2.7에서는 기본적으로 개발자에게 관심 있는 경고만을 무시하는 정책적 결정이 내려졌습니다. DeprecationWarning 및 그 파생 기능들은 더 이상 요청하지 않는 한 무시되어, 사용자가 응용 프로그램에 의해 발생한 경고를 보는 것을 방지합니다. 이 변경 사항은 Python 3.2가 된 브랜치에서도 적용되었습니다. (stdlib-sig에서 논의되었으며 :issue:`7319`에서 실행되었습니다.)

이전 버전에서는 DeprecationWarning 메시지가 기본적으로 활성화되어, Python 개발자에게 자신들의 코드가 미래 주요 버전의 파이썬에서 어디서 중단될 수 있는지 명확한 지표를 제공했습니다.

하지만, 파이썬 기반 응용 프로그램을 사용하는 사용자들 중에서 직접적으로 해당 응용 프로그램의 개발에 관여하지 않는 사용자가 기하급수적으로 늘고 있습니다. DeprecationWarning 메시지는 그러한 사용자들에게는 무관하며, 이는 실제로 올바르게 작동하는 응용 프로그램에 대해 걱정하게 만들고 응용 프로그램 개발자에게 이러한 우려 사항을 답변해야 하는 부담을 지웁니다.

Python을 -Wdefault (단축 형식: -Wd) 스위치를 사용하여 실행하거나, Python을 실행하기 전에 PYTHONWARNINGS 환경 변수를 "default"``(또는 ``"d")로 설정하여 DeprecationWarning 메시지 표시를 다시 활성화할 수 있습니다. 파이썬 코드는 또한 `warnings.simplefilter(‘default’)`를 호출함으로써 이를 다시 활성화할 수도 있습니다.

또한, unittest 모듈은 테스트를 실행할 때 폐지 경고를 자동으로 재활성화합니다.

Python 3.1 기능

Python 2.6이 Python 3.0의 기능을 통합한 정도만큼이나, 버전 2.7은 Python 3.1의 새로운 기능을 일부 포함하고 있습니다. 2.x 시리즈는 3.x 시리즈로 마이그레이션하기 위한 도구를 계속 제공합니다.

2.7에 백포트된 3.1 기능 목록 (일부):

  • 집합 리터럴의 구문법 ({1,2,3} 은 가변 집합입니다).

  • 딕셔너리 및 집합 컴프리헨션 ({i: i*2 for i in range(3)}).

  • 하나의 with 문에 여러 컨텍스트 관리자 사용.

  • 성능을 위해 C로 재작성된 새로운 버전의 io 라이브러리.

  • :ref:`pep-0372`에서 설명된 순서형 딕셔너리 타입.

  • pep-0378`에서 설명된 새로운 `”,”`` 형식 지정자.

  • memoryview 객체.

  • importlib 모듈의 작은 하위 집합 (아래에 <#importlib-section> 설명).

  • float xrepr() 은 많은 경우 더 짧습니다. 이제 ` repr(x)x 로 반올림될 것이 보장되는 가장 짧은 십진수 문자열을 기반으로 합니다. 이전 버전의 Python에서처럼, ` float(repr(x)) 이 ``x` 를 복구하는 것은 보장됩니다.

  • float에서 문자열로의 변환과 문자열에서 float으로의 변환은 올바르게 반올림됩니다. round() 함수 또한 이제 올바르게 반올림됩니다.

  • C API를 제공하는 데 사용되는 PyCapsule 타입입니다.

  • PyLong_AsLongAndOverflow() C API 함수입니다.

다른 새로운 Python 3 모드 경고에는 다음이 포함됩니다:

  • 3.x에서 지원되지 않는 operator.isCallable() 및 :func:`!operator.sequenceIncludes`가 이제 경고를 발생시킵니다.

  • -3 스위치가 이제 정수와 long 정수와 클래식 나눗셈 사용에 대한 경고를 유발하는 -Qwarn 스위치를 자동으로 활성화합니다.

PEP 372: collections 모듈에 Ordered Dictionary 추가

일반 Python 딕셔너리는 키/값 쌍을 임의 순서로 반복합니다. 수년 동안 많은 작성자들이 키가 원래 삽입된 순서를 기억하는 대체 구현체를 작성해 왔습니다. 이러한 구현체들의 경험을 바탕으로, 2.7에서는 collections 모듈에 새로운 OrderedDict 클래스를 도입했습니다.

OrderedDict API는 일반 딕셔너리와 동일한 인터페이스를 제공하지만, 키가 처음 삽입된 순서에 따라 키와 값들을 보장된 순서로 반복합니다:

>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
...                  ('second', 2),
...                  ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]

새 항목이 기존 항목을 덮어쓰는 경우, 원래의 삽입 위치는 변경되지 않습니다:

>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]

항목을 삭제하고 다시 삽입하면 끝으로 이동합니다:

>>> del d['second']
>>> d['second'] = 5
>>> d.items()
[('first', 1), ('third', 3), ('second', 5)]

popitem() 메서드는 기본값이 True 인 선택적 last 인수를 가집니다. last 가 참이면 가장 최근에 추가된 키가 반환되고 제거되며, 거짓이면 가장 오래된 키가 선택됩니다:

>>> od = OrderedDict([(x,0) for x in range(20)])
>>> od.popitem()
(19, 0)
>>> od.popitem()
(18, 0)
>>> od.popitem(last=False)
(0, 0)
>>> od.popitem(last=False)
(1, 0)

두 개의 순서 있는 딕셔너리를 비교하는 것은 키와 값 모두를 확인하며, 삽입 순서가 동일해야 합니다:

>>> od1 = OrderedDict([('first', 1),
...                    ('second', 2),
...                    ('third', 3)])
>>> od2 = OrderedDict([('third', 3),
...                    ('first', 1),
...                    ('second', 2)])
>>> od1 == od2
False
>>> # 'third' 키를 끝으로 이동
>>> del od2['third']; od2['third'] = 3
>>> od1 == od2
True

:class:`~collections.OrderedDict`와 일반 딕셔너리를 비교하는 것은 삽입 순서를 무시하고 단순히 키와 값만 비교합니다.

OrderedDict 는 어떻게 작동하나요? 키의 이중 연결 리스트를 유지하며, 새로운 키가 삽입될 때마다 리스트에 추가합니다. 보조 딕셔너리가 키를 해당 리스트 노드에 매핑하므로 삭제 시 전체 연결 리스트를 순회할 필요가 없어 O (1)을 유지합니다.

표준 라이브러리는 이제 여러 모듈에서 순서 있는 딕셔너리 사용을 지원합니다.

  • ConfigParser 모듈은 기본적으로 이를 사용하므로, 구성 파일들을 원래 순서대로 읽고, 수정하고, 다시 쓸 수 있습니다.

  • collections.namedtuple`의 :meth:`~collections.somenamedtuple._asdict() 메서드는 이제 기본 튜플 인덱스와 동일한 순서로 값들이 나타나는 순서 있는 딕셔너리를 반환합니다.

  • json 모듈의 JSONDecoder 클래스 생성자에 object_pairs_hook 매개변수가 확장되어 디코더에 의해 OrderedDict 인스턴스가 빌드될 수 있도록 허용했습니다. 또한 `PyYAML <https://pyyaml.org/>`와 같은 서드파티 도구도 지원되었습니다.

더 보기

PEP 372 - collections에 순서 있는 딕셔너리 추가

PEP는 Armin Ronacher와 Raymond Hettinger가 작성했고, Raymond Hettinger가 구현했습니다.

PEP 378: 천 단위 구분 기호 포매터

프로그램 출력을 더 읽기 쉽게 만들기 위해 큰 숫자에 구분 기호를 추가하는 것이 유용할 수 있습니다. 이렇게 하면 18446744073709551616 대신 18,446,744,073,709,551,616 와 같이 표시됩니다.

이를 위한 완전히 일반적인 해결책은 locale 모듈입니다. 여기서는 다른 구분 기호(북미에서는 “,” 또는 유럽에서 “.”)와 다른 그룹 크기를 사용할 수 있지만, :mod:`locale`는 사용하기 복잡하고 서로 다른 로케일에 대한 출력을 다른 스레드들이 생성하는 멀티스레드 애플리케이션에는 적합하지 않습니다.

따라서 간단한 쉼표 그룹화 메커니즘이 str.format() 메서드에서 사용하는 미니 언어에 추가되었습니다. 부동 소수점 숫자를 포매팅할 때는 너비와 정밀도 사이에 쉼표를 포함하기만 하면 됩니다:

>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'

정수를 포매팅할 때는 너비 뒤에 쉼표를 포함합니다:

>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'

이 메커니즘은 전혀 적용하기 어렵습니다. 쉼표는 항상 구분자로 사용되며 그룹화는 항상 3자리 그룹을 만듭니다. 이 쉼표 포매팅 메커니즘은 locale 모듈만큼 일반적이지 않지만, 사용하기 쉽습니다:

더 보기

PEP 378 - 천 단위 구분자용 포맷 지정자

PEP는 Raymond Hettinger가 작성하고 Eric Smith가 구현했습니다.

PEP 389: 명령행 파싱을 위한 argparse 모듈

명령줄 인자를 파싱하기 위한 argparse 모듈이 optparse 모듈의 보다 강력한 대체재로 추가되었습니다:

이는 파이썬이 이제 명령행 인자를 파싱하는 세 가지 다른 모듈을 지원한다는 것을 의미합니다: getopt, optparse, 및 argparse`입니다. :mod:`getopt 모듈은 C 라이브러리의 getopt() 함수와 매우 유사하므로, 결국 C로 재작성될 파이썬 프로토타입을 작성하는 경우 유용하게 사용됩니다. optparse`는 불필요해지지만, 여전히 많은 스크립트에서 사용하고 있어 제거할 계획은 없으며 자동화된 방식으로 스크립트들을 업데이트하는 방법도 없습니다. (:mod:`argparse API를 :mod:`optparse`의 인터페이스와 일치시키는 것은 너무 복잡하고 어렵다고 논의되었으나 기각되었습니다.)

요컨대, 새 스크립트를 작성하고 이전 버전의 파이썬과의 호환성을 걱정할 필요가 없다면, optparse 대신 :mod:`argparse`를 사용하세요:

다음은 예시입니다:

import argparse

parser = argparse.ArgumentParser(description='명령행 예제.')

# 선택적 스위치 추가
parser.add_argument('-v', action='store_true', dest='is_verbose',
                    help='상세한 출력 생성')
parser.add_argument('-o', action='store', dest='output',
                    metavar='FILE',
                    help='stdout 대신 FILE로 직접 출력')
parser.add_argument('-C', action='store', type=int, dest='context',
                    metavar='NUM', default=0,
                    help='추가 컨텍스트 NUM 라인 표시')

# 추가 인수가 아무거나 가능하도록 허용합니다.
parser.add_argument(nargs='*', action='store', dest='inputs',
                    help='입력 파일 이름 (기본값은 stdin)')

args = parser.parse_args()
print args.__dict__

재정의하지 않는 한, -h--help 스위치는 자동으로 추가되며 깔끔하게 포맷된 출력을 생성합니다:

-> ./python.exe argparse-example.py --help
usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]

Command-line example.

positional arguments:
  inputs      input filenames (default is stdin)

optional arguments:
  -h, --help  show this help message and exit
  -v          produce verbose output
  -o FILE     direct output to FILE instead of stdout
  -C NUM      display NUM lines of added context

:mod:`optparse`와 마찬가지로, 명령행 스위치와 인자는 dest 파라미터 이름으로 지정된 속성을 가진 객체로 반환됩니다:

-> ./python.exe argparse-example.py -v
{'output': None,
 'is_verbose': True,
 'context': 0,
 'inputs': []}

-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
{'output': '/tmp/output',
 'is_verbose': True,
 'context': 4,
 'inputs': ['file1', 'file2']}

argparse`는 :mod:`optparse`보다 훨씬 멋진 유효성 검사를 제공합니다. 인자 개수를 정수로 정확하게 지정할 수도 있고, `’*’ 전달하여 0개 이상의 인자를 받거나, ``'+'``를 전달하여 1개 이상의 인자를 받을 수도 있으며, 또는 ``'?'``로 선택적 인자를 정의할 수도 있습니다. 최상위 파서는 ``svn commit, svn checkout 등과 같이 서로 다른 스위치 세트를 가진 서브 명령을 정의하는 서브-파서를 포함할 수 있습니다. 인자의 유형은 FileType`으로 지정할 있으며, 이는 파일을 자동으로 열어주고 '-’`가 표준 입력 또는 출력을 의미한다는 것을 이해합니다.

더 보기

argparse 문서

argparse 모듈의 설명 페이지입니다.

optparse 코드를 argparse 로 마이그레이션

Python 문서의 일부로, :mod:`optparse`를 사용하는 코드를 변환하는 방법을 설명합니다.

PEP 389 - argparse - 새로운 명령행 파싱 모듈

PEP는 Steven Bethard가 작성하고 구현했습니다.

PEP 391: 로깅을 위한 딕셔너리 기반 설정

logging 모듈은 매우 유연합니다. 애플리케이션은 로깅 서브시스템의 트리를 정의할 수 있으며, 이 트리 내의 각 로거는 특정 메시지를 필터링하고, 다른 방식으로 포매팅하며, 다양한 수의 핸들러로 메시지를 보낼 수 있습니다:

이러한 유연성 때문에 많은 구성이 필요할 수 있습니다. Python 문장을 작성하여 객체를 생성하고 속성을 설정할 수 있지만, 복잡한 설정은 장황하지만 지루한 코드를 요구합니다. logging`은 또한 파일을 파싱하는 :func:`~logging.config.fileConfig 함수를 지원하지만, 파일 형식은 필터 구성을 지원하지 않으며 프로그램적으로 생성하는 것이 더 번거롭습니다.

Python 2.7에서는 딕셔너리를 사용하여 로깅을 구성하는 dictConfig() 함수가 추가되었습니다. 다양한 소스에서 딕셔너리를 생성하는 방법이 많습니다. 코드로 하나를 만들거나, JSON이 포함된 파일을 파싱하거나, 설치된 경우 YAML 파싱 라이브러리를 사용할 수 있습니다. 더 자세한 내용은 :ref:`logging-config-api`를 참조하십시오.

다음 예제는 두 개의 로거, 즉 루트 로거와 “network”이라는 이름의 로거를 구성합니다. 루트 로거로 전송된 메시지는 sysylog 프로토콜을 사용하여 시스템 로그로 전송되며, “network” 로거로 전송된 메시지는 로그가 1MB에 도달하면 순환되는 network.log 파일에 기록됩니다.

import logging
import logging.config

# 사용할 구성 스키마; 현재는 반드시 1이어야 함
configdict = {
 'version': 1,
 'formatters': {
     'standard': {
         'format': ('%(asctime)s %(name)-15s '
                    '%(levelname)-8s %(message)s')}},

 # 핸들러: netlog는 백업 카운트가 있고 syslog는 일반적인 오류 메시지를 처리합니다. (예시).
 'handlers': {'netlog': {'backupCount': 10,
                     'class': 'logging.handlers.RotatingFileHandler',
                     'filename': '/logs/network.log',
                     'formatter': 'standard',
                     'level': 'INFO',
                     'maxBytes': 1000000},
              'syslog': {'class': 'logging.handlers.SysLogHandler',
                         'formatter': 'standard',
                         'level': 'ERROR'}},

 # 모든 하위 로거를 지정합니다.
 'loggers': {
             'network': {
                         'handlers': ['netlog']
                     }
 },
 # 루트 로거의 속성을 지정합니다.
 'root': {
          'handlers': ['syslog']
 },
}

# 구성 설정
logging.config.dictConfig(configdict)

# 예시로 두 개의 오류 메시지를 기록합니다.
logger = logging.getLogger('/')
logger.error('데이터베이스를 찾을 수 없습니다')

netlogger = logging.getLogger('network')
netlogger.error('연결에 실패했습니다')

Vinay Sajip에 의해 구현된 logging 모듈의 세 가지 작은 향상은 다음과 같습니다:

  • SysLogHandler 클래스는 이제 TCP를 통한 syslogging을 지원합니다. 생성자는 사용할 소켓 유형을 지정하는 socktype 매개변수를 가지고 있으며, UDP의 경우 socket.SOCK_DGRAM, TCP의 경우 :const:`socket.SOCK_STREAM`입니다. 기본 프로토콜은 여전히 UDP입니다.

  • Logger 인스턴스는 이제 상대 경로를 사용하여 자손 로거(descendant logger)를 검색하는 getChild() 메서드를 갖게 되었습니다. 예를 들어, log = getLogger('app') 를 수행하여 로거를 가져온 다음, log.getChild('network.listen') 을 호출하는 것은 getLogger('app.network.listen') 과 동등합니다.

  • LoggerAdapter 클래스는 level 을 받아 기본 로거가 그 중요도 레벨의 메시지를 처리할지 여부를 반환하는 isEnabledFor() 메서드를 갖게 되었습니다.

더 보기

PEP 391 - 로깅을 위한 딕셔너리 기반 구성

Vinay Sajip가 작성하고 구현한 PEP.

PEP 3106: 딕셔너리 뷰

딕셔너리 메서드 keys(), values(), 및 :meth:`~dict.items`는 Python 3.x에서 다릅니다. 이들은 완전히 실재화된 리스트 대신 :dfn:`뷰`라는 객체를 반환합니다.

Python 2.7에서는 너무 많은 코드가 깨지기 때문에 keys(), values(), 및 x 버전은 새로운 이름인 :meth:()!viewkeys`, viewvalues(), 및 :meth:`!viewitems`으로 추가되었습니다.

>>> d = dict((i*10, chr(65+i)) for i in range(26))
>>> d
{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])

뷰는 반복할 수 있지만, 키 및 항목 뷰도 집합처럼 동작합니다. & 연산자는 교집합을 수행하고, | 는 합집합을 수행합니다:

>>> d1 = dict((i*10, chr(65+i)) for i in range(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | range(0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])

이 뷰는 딕셔너리 및 그 내용의 변경 사항을 추적합니다: 딕셔너리가 수정됨에 따라 변경됩니다:

>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])

다만, 뷰를 순회하는 동안 키를 추가하거나 제거할 수 없다는 점에 유의하십시오:

>>> for k in vk:
...     d[k*2] = k
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

Python 2.x 코드의 뷰 메서드를 사용할 수 있으며, 2to3 컨버터는 이를 표준 keys(), values(), 및 items() 메서드로 변경합니다.

더 보기

PEP 3106 - dict.keys(), .values() 및 .items() 개선

Guido van Rossum이 작성한 PEP. Alexandre Vassalotti가 2.7 버전으로 포팅했습니다. bpo-1967.

PEP 3137: memoryview 객체

memoryview 객체는 다른 객체의 메모리 내용에 대한 뷰를 제공하며, 이는 bytes 타입의 인터페이스와 일치합니다.

>>> import string
>>> m = memoryview(string.letters)
>>> m
<memory at 0x37f850>
>>> len(m)           # 하부 객체의 길이를 반환합니다.
52
>>> m[0], m[25], m[26]   # 인덱싱은 바이트 하나를 반환합니다.
('a', 'z', 'A')
>>> m2 = m[0:26]         # 슬라이싱은 다른 memoryview를 반환합니다.
>>> m2
<memory at 0x37f080>

뷰의 내용은 바이트 문자열이나 정수 리스트로 변환될 수 있습니다:

>>> m2.tobytes()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>

memoryview 객체는 하부 객체가 변경 가능한 객체인 경우 이를 수정할 수 있게 허용합니다.

>>> m2[0] = 75
Traceback (가장 최근에 발생한 호출:):
  File "<stdin>", line 1, in <module>
TypeError: 읽기 전용 메모리는 수정할 수 없습니다.
>>> b = bytearray(string.letters)  # 변경 가능한 객체를 생성합니다.
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*'         # 뷰에 할당하여 bytearray를 변경합니다.
>>> b[0:5]              # bytearray가 변경되었습니다.
bytearray(b'*bcde')
>>>

더 보기

PEP 3137 - 불변 바이트 및 가변 버퍼

Guido van Rossum이 작성한 PEP. Travis Oliphant, Antoine Pitrou 등이 구현했습니다. Antoine Pitrou가 2.7 버전으로 포팅했습니다. bpo-2396.

기타 언어 변경 사항

핵심 파이썬 언어에 일부 작은 변경 사항들이 있습니다.

  • 집합 리터럴의 문법은 Python 3.x에서 포팅되었습니다. 중괄호는 결과로 나오는 가변 집합의 내용을 감싸는 데 사용됩니다. 주의사항: 빈 집합을 만들려면 set() 를 사용해야 하며, {} 는 아닙니다; 후자는 빈 딕셔너리를 만드는데, 이 내용은 다음 섹션에서 다룹니다.

    >>> {1, 2, 3, 4, 5}
    set([1, 2, 3, 4, 5])
    >>> set() # 빈 집합
    set([])
    >>> {}    # 빈 딕셔너리
    {}
    

    Alexandre Vassalotti에 의해 포팅되었습니다. bpo-2335.

  • 딕셔너리 및 집합 컴프리헨션은 리스트/제너레이터 컴프리헨션의 일반화를 위해 3.x 버전에서 포팅된 또 다른 기능입니다. 이는 집합과 딕셔너리에 리터럴 구문을 사용합니다.

    >>> {x: x*x for x in range(6)}
    {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
    >>> {('a'*x) for x in range(6)}
    set(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])
    

    Alexandre Vassalotti에 의해 포팅되었습니다. bpo-2333.

  • with 문은 이제 하나의 문장에서 여러 컨텍스트 관리자를 사용할 수 있습니다. 컨텍스트 관리자는 왼쪽에서 오른쪽으로 처리되며 각각 새로운 with 문을 시작하는 것으로 간주됩니다. 이는 다음을 의미합니다:

    with A() as a, B() as b:
        ... suite of statements ...
    

    는 다음과 동등합니다:

    with A() as a:
        with B() as b:
            ... suite of statements ...
    

    contextlib.nested() 함수는 매우 유사한 기능을 제공하므로 더 이상 필요하지 않게 되어 비권장(deprecated)되었습니다.

    (https://codereview.appspot.com/53094에서 제안되었고; Georg Brandl이 구현했습니다.)

  • 부동 소수점 숫자와 문자열 간의 변환은 대부분의 플랫폼에서 이제 올바르게 반올림됩니다. 이러한 변환은 여러 곳에서 발생합니다: float 및 complex 숫자에 대한 str(); floatcomplex 생성자; 숫자 포맷팅; marshal, pickle, 및 json 모듈을 사용하여 부동 소수점 및 복소수를 직렬화 및 역직렬화하는 경우; Python 코드에서 float 및 허수 리터럴 구문 분석; 그리고 Decimal-to-float 변환입니다.

    이와 관련하여, 부동 소수점 숫자 xrepr() 은 이제 올바른 반올림(반올림 모드가 round-half-to-even인 경우)을 통해 x 로 돌아가도록 보장되는 가장 짧은 십진 문자열을 기반으로 결과를 반환합니다. 이전에는 x를 17개 십진 자리로 반올림한 결과에 기초한 문자열을 제공했습니다.

    The rounding library responsible for this improvement works on Windows and on Unix platforms using the gcc, icc, or suncc compilers. There may be a small number of platforms where correct operation of this code cannot be guaranteed, so the code is not used on such systems. You can find out which code is being used by checking sys.float_repr_style, which will be short if the new code is in use and legacy if it isn’t.

    Eric Smith와 Mark Dickinson가 David Gay의 dtoa.c 라이브러리를 사용해 구현했습니다; bpo-7117.

  • 이제 Long 정수와 일반 정수에서 부동 소수점으로의 변환은 반올림 방식이 달라져 숫자에 가장 가까운 부동 소수점 수를 반환합니다. 이 점은 정확하게 변환할 수 있는 작은 정수에는 문제가 없지만, 정밀도가 불가피하게 손실될 큰 숫자들의 경우 Python 2.7에서는 더 가깝게 근사화됩니다. 예를 들어, Python 2.6은 다음을 계산했습니다:

    >>> n = 295147905179352891391
    >>> float(n)
    2.9514790517935283e+20
    >>> n - long(float(n))
    65535L
    

    Python 2.7의 부동 소수점 결과는 더 크지만 실제 값에 훨씬 더 가깝습니다:

    >>> n = 295147905179352891391
    >>> float(n)
    2.9514790517935289e+20
    >>> n - long(float(n))
    -1L
    

    (Mark Dickinson가 구현했습니다; bpo-3166.)

    정수 나눗셈도 반올림 동작 방식에서 더 정확해졌습니다. (또한 Mark Dickinson가 구현했습니다; bpo-1811.)

  • 복소수에 대한 암묵적 강제 변환이 제거되었습니다. 인터프리터는 더 이상 복소수 객체에 __coerce__() 메서드를 호출하려고 시도하지 않습니다. (Meador Inge와 Mark Dickinson가 제거했습니다; bpo-5211.)

  • str.format() 메서드는 이제 대체 필드의 자동 번호를 지원합니다. 이를 통해 str.format`을 사용하는 것이 ``%s`() 포맷팅 사용과 더 유사해졌습니다:

    >>> '{}:{}:{}'.format(2009, 04, 'Sunday')
    '2009:4:Sunday'
    >>> '{}:{}:{day}'.format(2009, 4, day='Sunday')
    '2009:4:Sunday'
    

    자동 번호 매김은 왼쪽에서 오른쪽으로 필드를 가져가므로, 첫 번째 {...} 지정자는 str.format`의 번째 인수를 사용하고, 다음 지정자는 다음 인수를 사용하며, 외도 마찬가지입니다. 자동 번호 매김과 명시적 번호 매김을 혼합할 수는 없습니다. 따라서 모든 지정자 필드를 번호를 붙이거나 아예 번호를 붙이지 않아야 합니다. 하지만 위의 번째 예시처럼 자동 번호 매김과 이름 지정된 필드는 섞어 표시할 있습니다. (Eric Smith가 기여했습니다; :issue:`5237().)

    복소수는 이제 format() 사용을 올바르게 지원하며 기본적으로 오른쪽 정렬됩니다. 정밀도 지정이나 쉼표 분리는 실수부와 허수부에 모두 적용되지만, 지정된 필드 너비 및 정렬은 결과 1.5+3j 전체에 적용됩니다. (Eric Smith가 기여했습니다; bpo-1588bpo-7988.)

    ‘F’ 포맷 코드는 이제 항상 대문자 문자로 출력을 포맷하므로, ‘INF’와 ‘NAN’을 생성합니다. (Eric Smith가 기여했습니다; bpo-3382.)

    낮은 수준의 변경 사항입니다: object.__format__() 메서드는 형식 문자열이 전달되면 PendingDeprecationWarning`을 발생시킵니다. :class:`object`에 대한 :meth:!__format__` 메서드가 객체를 문자열 표현으로 변환하고 이를 포맷하기 때문입니다. 이전에는 이 메서드가 형식 문자열을 문자열 표현에 조용히 적용했지만, 이는 Python 코드의 실수를 숨길 수 있었습니다. 만약 정렬이나 정밀도와 같은 포맷팅 정보를 제공하는 경우, 아마도 객체별 방식으로 포맷이 적용되기를 기대할 것입니다. (Eric Smith가 수정했습니다; bpo-7994.)

  • int()long() 타입은 인수를 이진수로 나타내는 데 필요한 비트 수를 반환하는 bit_length 메서드를 얻게 되었습니다:

    >>> n = 37
    >>> bin(n)
    '0b100101'
    >>> n.bit_length()
    6
    >>> n = 2**123-1
    >>> n.bit_length()
    123
    >>> (n+1).bit_length()
    124
    

    (Fredrik Johansson와 Victor Stinner가 기여했습니다; bpo-3439.)

  • import 문은 이제 상대 임포트(예: from .os import sep)가 실패할 경우 절대 임포트를 더 이상 시도하지 않습니다. 이는 버그를 수정하는 것이지만, 우연히 작동하던 특정 import 문을 손상시킬 수 있습니다. (Meador Inge가 수정했습니다; bpo-7902.)

  • 이제 내장 unicode 타입의 서브클래스는 __unicode__() 메서드를 오버라이드 할 수 있습니다. (Victor Stinner가 구현했습니다; bpo-1583863.)

  • bytearray 타입의 translate() 메서드는 이제 첫 번째 인수로 None 을 허용합니다. (Georg Brandl이 수정했습니다; bpo-4759.)

  • 메서드를 클래스 또는 정적 메서드로 래핑할 때 @classmethod`와 :deco:`staticmethod`를 사용하면, 래퍼 객체가 이제 래핑된 함수를 그들의 :attr:`~method.__func__ 어트리뷰트로 노출합니다. (Amaury Forgeot d’Arc가 George Sakkis의 제안 이후 기여했습니다; bpo-5982.)

  • 제한된 속성 세트가 __slots__ 를 사용하여 설정되었을 때, 설정되지 않은 속성을 삭제해도 기대했던 대로 AttributeError 를 발생시키지 않습니다. Benjamin Peterson이 수정했습니다; bpo-7604.)

  • 두 개의 새로운 인코딩이 지원됩니다: 아랍어 텍스트에 주로 사용되는 “cp720”과 유로 기호를 추가한 CP 850의 변형인 “cp858”입니다. (CP720은 Alexander Belchenko와 Amaury Forgeot d’Arc가 :issue:`1616979`에서 기여했으며, CP858은 Tim Hatch가 :issue:`8016`에서 기여했습니다.)

  • The file object will now set the filename attribute on the IOError exception when trying to open a directory on POSIX platforms (noted by Jan Kaliszewski; bpo-4764), and now explicitly checks for and forbids writing to read-only file objects instead of trusting the C library to catch and report the error (fixed by Stefan Krah; bpo-5677).

  • The Python tokenizer now translates line endings itself, so the compile() built-in function now accepts code using any line-ending convention. Additionally, it no longer requires that the code end in a newline.

  • Python 3.x에서는 함수 정의에서 추가적인 괄호가 불법이며, 이로 인해 def f((x)): pass 와 같은 구문 오류가 발생합니다. Python3-warning 모드에서는 Python 2.7이 이러한 이상한 사용에 대해 경고를 표시할 것입니다 (James Lingard가 알렸으며, bpo-7362.).

  • 이제 구형 클래스 객체에 대한 약한 참조를 생성하는 것이 가능합니다. 신규 스타일 클래스는 항상 약한 참조가 가능했습니다 (Antoine Pitrou가 수정했으며, bpo-8268.).

  • 모듈 객체가 가비지 수집되면, 이제 모듈의 딕셔너리는 아무도 해당 딕셔너리에 대한 참조를 가지고 있지 않을 때만 비워지고( bpo-7140.), 그 외에는 유지됩니다.

인터프리터 변경 사항

A new environment variable, PYTHONWARNINGS, allows controlling warnings. It should be set to a string containing warning settings, equivalent to those used with the -W switch, separated by commas. (Contributed by Brian Curtin; bpo-7301.)

예를 들어, 다음 설정은 경고가 발생할 때마다 경고를 출력하지만, Cookie 모듈의 경고를 에러로 변경합니다. (환경 변수를 설정하는 정확한 구문은 운영 체제와 셸에 따라 다릅니다.)

export PYTHONWARNINGS=all,error:::Cookie:0

최적화들`

여러 성능 향상이 추가되었습니다:

  • A new opcode was added to perform the initial setup for with statements, looking up the __enter__() and __exit__() methods. (Contributed by Benjamin Peterson.)

  • 가비지 컬렉터는 이제 일반적인 사용 패턴 중 하나에서 성능을 개선합니다. 즉, 많은 객체가 할당되고 아무것도 해제되지 않는 경우입니다. 이전에는 가비지 수집에 대해 이차(quadratic) 시간이 걸렸으나, 이제 힙에 있는 객체 수가 증가함에 따라 전체 가비지 수집 횟수가 줄어듭니다. 새로운 로직은 중간 세대에서 10번이 수거되었고 중간 세대의 생존 객체 수가 가장 오래된 세대의 객체 수의 10%를 초과할 때만 전체 가비지 수집 패스를 수행합니다 (Martin von Löwis가 제안하고 Antoine Pitrou가 구현했습니다; bpo-4074.).

  • 가비지 컬렉터는 순환에 속할 수 없는 간단한 컨테이너를 추적하는 것을 피하려고 합니다. Python 2.7에서는 이제 원자형 타입(예: int, string 등)을 포함하는 튜플과 딕셔너리에 대해 이 점이 적용됩니다. 따라서 원자형 타입을 포함하는 튜플로 된 딕셔너리도 전이적으로 추적되지 않습니다. 이는 컬렉터가 고려하고 순회해야 하는 객체 수를 줄여 각 가비지 수집의 비용을 절감합니다 (Antoine Pitrou가 기여했습니다; bpo-4688.).

  • 정수형은 이제 내부적으로 기본 2**15 또는 기본 2**30 의 두 가지 방식으로 저장되며, 기본 값은 빌드 시간에 결정됩니다. 이전에는 항상 기본 2**15 로 저장되었습니다. 기본 2**30 을 사용하면 64비트 기계에서 상당한 성능 향상을 얻지만, 32비트 기계에서의 벤치마크 결과는 혼재되어 왔습니다. 따라서 기본값은 64비트 기계에서는 기본 2**30 을, 32비트 기계에서는 기본 2**15 를 사용하도록 되어 있으며; 유닉스에서는 이 기본값을 재정의할 수 있는 새로운 configure 옵션인 --enable-big-digits 가 있습니다.

    성능 향상 외에도 이 변경 사항은 최종 사용자에게는 눈에 띄지 않을 것입니다. 단 한 가지 예외가 있습니다. 테스트 및 디버깅 목적으로 내부 형식에 대한 정보(각 자릿수당 비트 수와 각 자릿수를 저장하는 데 사용되는 C 타입의 바이트 크기)를 제공하는 새로운 structseq :data:`!sys.long_info`가 추가되었습니다.:

    >>> import sys
    >>> sys.long_info
    sys.long_info(bits_per_digit=30, sizeof_digit=4)
    

    (마크 디킨슨 기여; bpo-4258.)

    또 다른 변경 사항 세트는 long 객체의 크기를 몇 바이트 줄였습니다. 32비트 시스템에서는 2바이트, 64비트 시스템에서는 6바이트가 작아졌습니다. (마크 디킨슨 기여; bpo-5260.)

  • 다음은 내부 루프를 강화하고, 곱셈 대신 시프트 연산을 수행하며, 불필요한 추가 반복을 수정하여 long 정수에 대한 나눗셈 알고리즘이 더 빨라졌음을 보여줍니다. 다양한 벤치마크는 long 정수 나눗셈 및 나머지 연산에서 50%에서 150% 사이의 속도 향상을 보여줍니다. (마크 디킨슨 기여; bpo-5512.) 비트 단위 연산 또한 훨씬 더 빠릅니다 (최초 패치: 그레고리 스미스; bpo-1087418).

  • % 의 구현은 왼쪽 피연산자가 파이썬 문자열인지 확인하고 이를 특별 처리합니다. 이로 인해 템플릿 라이브러리와 같이 % 를 문자열과 자주 사용하는 애플리케이션에서 1~3%의 성능 향상이 발생합니다. (콜린 윈터가 구현; bpo-5176.)

  • if 조건이 있는 리스트 컴프리헨션은 더 빠른 바이트코드로 컴파일됩니다. (앙투안 피트로가 패치하고, 제프리 야스키나가 2.7로 백포팅; bpo-4715.)

  • 정수 또는 long 정수를 십진 문자열로 변환하는 과정에서, 임의의 진법을 지원하는 일반화된 변환 함수를 사용하는 대신 기본 10진법에 특수 처리하여 더 빨라졌습니다. (가윈 볼튼이 패치; bpo-6713.)

  • 문자열 유사 타입(문자열, 유니코드 문자열 및 bytearray 객체)의 split(), replace(), rindex(), rpartition(), 및 rsplit() 메서드가 이제 문자별 스캔 대신 빠른 역순 검색 알고리즘을 사용합니다. 이는 때로는 10배 더 빠릅니다. (플로렌 피클루나가 추가; bpo-7462bpo-7622).

  • :mod:`pickle`와 :mod:!cPickle` 모듈은 이제 속성 이름을 위해 사용되는 문자열을 자동으로 내부화하여 언피클링으로 생성된 객체의 메모리 사용량을 줄입니다. (제이크 맥과이어 기여; bpo-5084.)

  • :mod:!cPickle` 모듈은 이제 딕셔너리에 대해 특별 케이스를 적용하여, 이를 피클링하는 데 필요한 시간을 거의 절반으로 줄였습니다. (콜린 윈터 기여; bpo-5670.)

개선 및 신규 모듈

모든 릴리스와 마찬가지로, 파이썬 표준 라이브러리는 여러 개선 사항과 버그 수정 기능을 받았습니다. 가장 주목할 만한 변경점들을 모듈 이름에 따라 알파벳순으로 나열했습니다. 더 완전한 목록을 보려면 소스 트리의 Misc/NEWS 파일을 참조하거나 모든 세부 사항은 Subversion 로그를 확인하십시오.

  • bdb 모듈의 기본 디버깅 클래스 Bdb 에 모듈 건너뛰기 기능이 추가되었습니다. 생성자는 이제 django.* 와 같은 glob 스타일 패턴을 포함하는 반복 가능한 객체를 받습니다. 이 경우, 디버거는 해당 패턴과 일치하는 모듈의 스택 프레임으로 진입하지 않습니다. (센틸 쿠마란의 제안 이후 마루 뉴비가 기여; bpo-5142.)

  • binascii 모듈은 이제 버퍼 API를 지원하므로 memoryview 인스턴스와 다른 유사한 버퍼 객체와 함께 사용될 수 있습니다. (플로렌 피클루나가 3.x 버전에서 백포팅; bpo-7703.)

  • 업데이트된 모듈: :mod:!bsddb` 모듈이 4.7.2devel9 버전에서 the pybsddb package <https://www.jcea.es/programacion/pybsddb.htm>`의 4.8.4 버전으로 업데이트되었습니다. 새 버전은 개선된 Python 3.x 호환성, 다양한 버그 수정 사항을 특징으로 하며 몇 가지 새로운 BerkeleyDB 플래그 및 메서드를 추가합니다. (헤수스 세아 아비온이 업데이트했습니다; :issue:`8156. pybsddb 변경 로그는 https://hg.jcea.es/pybsddb/file/tip/ChangeLog에서 읽을 수 있습니다.)

  • bz2 모듈의 BZ2File 이 이제 컨텍스트 관리 프로토콜을 지원하므로, with bz2.BZ2File(...) as f: 와 같이 작성할 수 있습니다. (하겐 <0xED><0x93><0x8C>르스테나우가 기여; bpo-3860.)

  • 새 클래스: Countercollections 모듈에 있으며 데이터를 집계하는 데 유용합니다. Counter 인스턴스는 대부분 딕셔너리와 유사하게 작동하지만, 키가 누락되었을 때 KeyError 를 발생시키는 대신 0을 반환합니다.

    >>> from collections import Counter
    >>> c = Counter()
    >>> for letter in 'here is a sample of english text':
    ...   c[letter] += 1
    ...
    >>> c
    Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2,
    'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1,
    'p': 1, 'r': 1, 'x': 1})
    >>> c['e']
    5
    >>> c['z']
    0
    

    추가로 세 가지 Counter 메서드가 있습니다. :meth:`~collections.Counter.most_common`은 N개의 가장 일반적인 요소와 그 개수를 반환합니다. :meth:`~collections.Counter.elements`는 포함된 요소들을 반복하는 이터레이터를 반환하며, 각 요소를 해당 카운트 수만큼 반복합니다. :meth:`~collections.Counter.subtract`는 이터러블을 받고 추가 대신 각 요소에 대해 1씩 빼줍니다. 인자가 딕셔너리나 다른 :class:`Counter`인 경우, 개수가 차감됩니다.

    >>> c.most_common(5)
    [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)]
    >>> c.elements() ->
       'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ',
       'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i',
       'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's',
       's', 's', 'r', 't', 't', 'x'
    >>> c['e']
    5
    >>> c.subtract('very heavy on the letter e')
    >>> c['e'] # 카운트가 이제 낮아졌습니다
    -1
    

    Raymond Hettinger님이 기여함; bpo-1696199.

    새 클래스: :class:`~collections.OrderedDict`는 이전 섹션 :ref:`pep-0372`에서 설명되어 있습니다.

    새 메서드: deque 데이터 타입은 이제 요청된 인자 x 와 같은 포함 요소 개수를 반환하는 count() 메서드와 데크의 요소를 제자리에서 역순으로 만드(뒤집는) reverse() 메서드를 갖게 되었습니다. 또한 deque 는 최대 길이를 읽기 전용 maxlen 속성으로 노출합니다. (두 기능 모두 Raymond Hettinger님이 추가했습니다.)

    namedtuple 클래스는 이제 선택적 rename 매개변수를 갖습니다. 만약 rename 이 true이면, 반복되었거나 유효한 파이썬 식별자가 아닌 필드 이름은 내부의 필드 목록 내 위치에서 파생된 유효한 이름으로 이름을 변경합니다:

    >>> from collections import namedtuple
    >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True)
    >>> T._fields
    ('field1', '_1', '_2', 'field2')
    

    (Raymond Hettinger님이 추가함; bpo-1818.)

    마지막으로, Mapping 추상 기본 클래스는 이제 매핑을 Mapping`가 아닌 다른 타입과 비교하면 :data:`NotImplemented`를 반환합니다. (Daniel Stutzbach님이 수정함; :issue:`8729.)

  • ConfigParser 모듈의 구문 분석 클래스 생성자는 이제 allow_no_value 매개변수를 받으며, 기본값은 false입니다. true인 경우, 값 없이 옵션도 허용됩니다. 예를 들면:

    >>> import ConfigParser, StringIO
    >>> sample_config = """
    ... [mysqld]
    ... user = mysql
    ... pid-file = /var/run/mysqld/mysqld.pid
    ... skip-bdb
    ... """
    >>> config = ConfigParser.RawConfigParser(allow_no_value=True)
    >>> config.readfp(StringIO.StringIO(sample_config))
    >>> config.get('mysqld', 'user')
    'mysql'
    >>> print config.get('mysqld', 'skip-bdb')
    None
    >>> print config.get('mysqld', 'unknown')
    Traceback (most recent call last):
      ...
    NoOptionError: No option 'unknown' in section: 'mysqld'
    

    (Mats Kindahl님이 기여함; bpo-7005.)

  • 사용 중단 기능: 단일 with 문으로 하나 이상의 컨텍스트 관리자를 처리할 수 있게 해준 contextlib.nested`가 사용 중단되었습니다. 왜냐하면 이제 :keyword:()!with` 문이 여러 컨텍스트 관리자를 지원하기 때문입니다.

  • cookielib 모듈은 버전 필드가 유효하지 않거나 정수 값을 포함하지 않는 쿠키를 무시합니다. (John J. Lee님이 수정함; bpo-3924.)

  • copy 모듈의 deepcopy() 함수는 이제 바인딩된 인스턴스 메서드를 올바르게 복사합니다. (Robert Collins님이 구현함; bpo-1515.)

  • ctypes 모듈은 이제 포인터로 선언된 인자들에 대해 항상 None``을 C ``NULL 포인터로 변환합니다. (Thomas Heller님이 변경함; bpo-4606.) 근본적인 libffi library <https://sourceware.org/libffi/>`는 다양한 플랫폼에 대한 여러 수정 사항이 포함된 버전 3.0.9로 업데이트되었습니다. (Matthias Klose님이 업데이트함; :issue:`8142.)

  • 새 메서드: datetime 모듈의 timedelta 클래스는 기간에 포함된 초를 반환하는 total_seconds() 메서드를 얻게 되었습니다. (Brian Quinlan님이 기여함; bpo-5788.)

  • 새로운 메서드: Decimal 클래스는 부동 소수점 숫자를 Decimal 로 정확하게 변환하는 from_float() 이라는 클래스 메서드를 갖게 되었습니다. 이 정확한 변환은 부동 소수점 표현 값에 가장 가까운 십진수 근사값을 추구하며, 따라서 결과 십진수 값에는 부정확함이 남아 있을 수 있습니다. 예를 들어, Decimal.from_float(0.1)Decimal('0.1000000000000000055511151231257827021181583404541015625') 을 반환합니다. (bpo-4796 에 의해 Raymond Hettinger가 구현함.)

    Decimal 인스턴스와 부동 소수점 숫자를 비교하는 것은 이제 피연산자의 숫자 값에 기초한 합리적인 결과를 생성합니다. 이전에는 이러한 비교가 객체 비교를 위한 파이썬의 기본 규칙으로 대체되어, 그 타입에 따라 임의의 결과를 산출했습니다. 여전히 Decimal`와 부동 소수점을 덧셈과 같은 다른 연산에서 결합할 수는 없다는 점을 유의하십시오. 왜냐하면 float와 :class:!Decimal` 간 변환 방법을 명시적으로 선택해야 하기 때문입니다. (:issue:`2531`에 의해 Mark Dickinson가 수정함.)

    Decimal`의 생성자는 이제 부동 소수점 숫자 (Raymond Hettinger 추가; :issue:`8257)와 아랍-인디아 숫자와 같은 비(非)유럽어 유니코드 문자도 허용합니다 (Mark Dickinson 기여; bpo-6595).

    Context 클래스의 대부분의 메서드는 이제 :class:`~decimal.Decimal 인스턴스뿐만 아니라 정수도 허용합니다. 예외는 is_canonical() 메서드입니다. (:issue:`7633`에 의해 Juan José Conti가 패치함.)

    Decimal 인스턴스를 문자열의 format() 메서드와 함께 사용할 때, 기본 정렬 방식이 이전에는 왼쪽 정렬이었습니다. 이는 숫자인 타입에 더 합리적인 오른쪽 정렬 방식으로 변경되었습니다. (:issue:`6857`에 의해 Mark Dickinson가 변경함.)

    신호 NaN 값 (또는 sNAN)을 포함하는 비교 연산은 이제 비교 연산자에 따라 참 또는 거짓 값을 조용히 반환하는 대신 Quiet NaN (또는 ``NaN`)도 이제 해시 가능합니다. (:issue:`7279`에 의해 Mark Dickinson가 수정함.)

  • difflib 모듈은 now output을 더 많은 공간(space) 대신 탭 문자(tab character)를 구분자로 사용함으로써, 현대 diff/patch 도구와 더욱 호환되는 출력을 생성합니다. (Anatoly Techtonik가 수정함; bpo-7585.)

  • Distutils의 sdist 명령어는 이제 항상 MANIFEST 파일을 재생성합니다. 이는 MANIFEST.in 또는 setup.py 파일이 수정되지 않았더라도 사용자가 포함해야 할 새로운 파일을 생성했을 수 있기 때문입니다. (:issue:`8688`에 의해 Tarek Ziadé가 수정함.)

  • doctest 모듈의 IGNORE_EXCEPTION_DETAIL 플래그는 이제 테스트되는 예외를 포함하는 모듈의 이름은 무시합니다. (:issue:`7490`에 의해 Lennart Regebro가 패치함.)

  • email 모듈의 Message 클래스는 이제 유니코드 값을 가진 페이로드를 허용하며, 이 페이로드를 :attr:`!output_charset`으로 지정된 인코딩으로 자동 변환합니다. (:issue:`1368247`에 의해 R. David Murray가 추가함.)

  • The Fraction class now accepts a single float or Decimal instance, or two rational numbers, as arguments to its constructor. (Implemented by Mark Dickinson; rationals added in bpo-5812, and float/decimal in bpo-8294.)

    분수(fractions)와 복소수 사이의 순서 비교 (<, <=, >, >=)는 이제 :exc:`TypeError`를 발생시킵니다. 이는 :class:`~fractions.Fraction`가 다른 숫자 타입들과 일치하도록 하는 간과된 부분을 수정합니다.

  • 새로운 클래스: ftplib 모듈의 `:class:`~ftplib.FTP_TLS`는 인증뿐만 아니라 후속 제어 및 데이터 전송을 TLS 캡슐화하여 안전한 FTP 연결을 제공합니다. (:issue:`2054`에 의해 Giampaolo Rodola가 기여함.)

    바이너리 업로드를 위한 storbinary() 메서드는 이제 추가된 rest 매개변수 덕분에 업로드 재시작이 가능합니다 (:issue:`6845`에 의해 Pablo Mouzo가 패치함.)

  • @~functools.total_ordering`을 위한 클래스 데코레이터는 :mod:`functools 모듈에서, :meth:`~object.__eq__ 메서드를 정의하고 하나 이상의 __lt__(), __le__(), __gt__(), 또는 __ge__() 메서드를 받는 클래스를 가져와 누락된 비교 메서드를 생성합니다. __cmp__() 메서드가 Python 3.x에서 지원이 중단됨에 따라, 이 데코레이터는 순서가 지정된 클래스를 정의하기 쉽게 만듭니다. (Raymond Hettinger 추가; bpo-5479.)

    cmp_to_key`라는 함수는 개의 인수를 예상하는 레거시 비교 함수를 받아, :func:`sorted(), min(), max() 등과 같은 함수에서 key 매개변수로 사용될 수 있는 새로운 호출 가능한 객체를 반환합니다. 주된 의도된 용도는 코드를 Python 3.x와 호환되도록 만드는 데 도움을 주는 것입니다. (Raymond Hettinger 추가.)

  • 새 함수: gc 모듈의 is_tracked`는 주어진 인스턴스가 가비지 컬렉터에 의해 추적되고 있으면 `true(), 그렇지 않으면 false`를 반환합니다. (Antoine Pitrou 기여; :issue:`4688.)

  • The gzip module’s GzipFile now supports the context management protocol, so you can write with gzip.GzipFile(...) as f: (contributed by Hagen Fürstenau; bpo-3860), and it now implements the io.BufferedIOBase ABC, so you can wrap it with io.BufferedReader for faster processing (contributed by Nir Aides; bpo-7471). It’s also now possible to override the modification time recorded in a gzipped file by providing an optional timestamp to the constructor. (Contributed by Jacques Frechet; bpo-4272.)

    gzip 형식의 파일은 후행 0 바이트로 패딩될 수 있습니다; gzip 모듈은 이제 이러한 후행 바이트를 소비합니다. (Tadek Pietraszek와 Brian Curtin 수정; bpo-2846.)

  • 새 속성: hashlib 모듈은 이제 지원되는 알고리즘 이름을 포함하는 튜플인 algorithms 속성을 갖습니다. Python 2.7에서는 hashlib.algorithms('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512') 를 포함합니다. (Carl Chenet 기여; bpo-7418.)

  • httplib 모듈에서 사용되는 기본 HTTPResponse 클래스가 버퍼링을 지원하게 되어 HTTP 응답의 읽기 속도가 훨씬 빨라졌습니다. (Kristján Valur Jónsson 기여; bpo-4879.)

    HTTPConnectionHTTPSConnection 클래스는 이제 source_address 매개변수를 지원하며, 이는 연결에 사용될 소스 주소를 지정하는 (호스트, 포트) 2-튜플입니다. (Eldon Ziegler 기여; bpo-3972.)

  • ihooks 모듈은 이제 상대 임포트를 지원합니다. 참고로, ihooks`는 임포트를 사용자 정의하기 위한 오래된 모듈이며 Python 2.0에서 추가된 :mod:!imputil` 모듈로 대체되었습니다. (상대 임포트 지원은 Neil Schemenauer가 추가.)

  • imaplib 모듈이 이제 IPv6 주소를 지원합니다. (Derek Morr 기여; bpo-1655.)

  • 새 함수: inspect 모듈의 :func:`~inspect.getcallargs`는 호출 가능한 객체와 해당 위치 및 키워드 인수를 받아서, 호출 가능한 객체의 매개변수 중 어떤 것이 각 인수를 받을지 알아내고, 인수 이름과 값의 사전을 반환합니다. 예를 들어:

    >>> from inspect import getcallargs
    >>> def f(a, b=1, *pos, **named):
    ...     pass
    ...
    >>> getcallargs(f, 1, 2, 3)
    {'a': 1, 'b': 2, 'pos': (3,), 'named': {}}
    >>> getcallargs(f, a=2, x=4)
    {'a': 2, 'b': 1, 'pos': (), 'named': {'x': 4}}
    >>> getcallargs(f)
    Traceback (most recent call last):
    ...
    TypeError: f() takes at least 1 argument (0 given)
    

    George Sakkis 기여; bpo-3135.

  • 업데이트된 모듈: io 라이브러리가 Python 3.1에 포함된 버전으로 업그레이드되었습니다. 3.1의 경우, I/O 라이브러리는 C로 완전히 재작성되었으며 수행하는 작업에 따라 2배에서 20배까지 빠릅니다. 원래 파이썬 버전은 _pyio 모듈로 이름이 변경되었습니다.

    사소하게 변경된 결과: io.TextIOBase 클래스는 이제 인코딩 및 디코딩 오류에 사용되는 오류 설정을 제공하는 errors 속성을 갖게 되었습니다 ('strict', 'replace', 'ignore' 중 하나).

    io.FileIO 클래스는 이제 유효하지 않은 파일 디스크립터가 전달될 때 OSError`를 발생시킵니다. (Benjamin Peterson 구현; :issue:`4991.) truncate() 메서드는 이제 파일 위치를 보존합니다. 이전에는 새 파일의 끝으로 파일 위치를 변경했습니다. (Pascal Chambon 수정; bpo-6939.)

  • 새 함수: itertools.compress(data, selectors) 는 두 이터레이터를 받습니다. data 의 요소들은 해당 selectors 값이 참일 경우 반환됩니다:

    itertools.compress('ABCDEF', [1,0,1,0,1,1]) =>
      A, C, E, F
    

    새 함수: itertools.combinations_with_replacement(iter, r) 은 이터러블 iter 에서 가능한 모든 r-길이의 조합을 반환합니다. combinations() 와 달리 개별 요소는 생성된 조합에 반복될 수 있습니다:

    itertools.combinations_with_replacement('abc', 2) =>
      ('a', 'a'), ('a', 'b'), ('a', 'c'),
      ('b', 'b'), ('b', 'c'), ('c', 'c')
    

    요소들은 실제 값에 의존하는 것이 아니라 입력에서의 위치에 따라 고유한 것으로 간주됩니다.

    itertools.count() 함수는 이제 값을 1이 아닌 값으로 증가시킬 수 있는 step 인수를 가집니다. Decimal() 인스턴스 같은 비정수 값도 사용할 수 있습니다. (Raymond Hettinger에 의해 구현; bpo-5032.)

    itertools.combinations`와 :func:`itertools.product`는 이전에 입력 이터러블보다 *r* 값에 대해 :exc:`ValueError`를 발생시켰습니다. 이는 사양 오류로 간주되어, 이제 이터레이터를 반환합니다. (Raymond Hettinger가 수정; :issue:`4816().)

  • 업데이트된 모듈: json 모듈은 인코딩 및 디코딩을 더 빠르게 만드는 C 확장이 포함된 simplejson 패키지 버전 2.0.9로 업그레이드되었습니다. (Bob Ippolito가 기여; bpo-4136.)

    새로운 collections.OrderedDict 타입을 지원하기 위해, json.load`에는 이제 쌍의 리스트로 디코딩되는 모든 객체 리터럴에 사용될 *object_pairs_hook* 이라는 선택적 매개변수가 추가되었습니다. (Raymond Hettinger가 기여; :issue:`5381().)

  • mailbox 모듈의 Maildir 클래스는 이제 읽은 디렉터리에 타임스탬프를 기록하며, 수정 시간이 이후에 변경된 경우에만 다시 읽습니다. 이는 불필요한 디렉토리 스캔을 방지하여 성능을 향상시킵니다. (A.M. Kuchling과 Antoine Pitrou가 수정; bpo-1607951, bpo-6896.)

  • 새 함수: math 모듈에 에러 함수와 상보적 에러 함수의 erf()erfc(), expm1(), 감마 함수의 gamma(), 그리고 감마 함수의 자연 로그 값을 위한 (Mark Dickinson nirinA raseliarison이 기여; :issue:`3366().)

  • multiprocessing 모듈의 Manager* 클래스들은 이제 서브 프로세스가 시작될 때마다 호출될 콜러블과, 이 콜러블에 전달될 인자 집합을 전달할 수 있습니다. (lekma가 기여; bpo-5585.)

    작업자 프로세스 그룹을 제어하는 Pool 클래스는 이제 선택적 maxtasksperchild 매개변수를 가집니다. 작업자 프로세스는 지정된 수의 작업을 수행한 후 종료하여, Pool`가 작업자를 시작하게 만듭니다. 기능은 작업이 메모리나 다른 리소스를 누설하거나, 일부 작업으로 인해 작업자가 매우 커질 있는 경우 유용합니다. (Charles Cazabon가 기여; :issue:`6963.)

  • nntplib 모듈이 이제 IPv6 주소를 지원합니다. (Derek Morr가 기여; bpo-1664.)

  • 새 함수: os 모듈은 다음 POSIX 시스템 호출을 래핑합니다. getresgid()setresgid() 기여했습니다; :issue:`6508(). initgroups 지원은 Jean-Paul Calderone이 추가했습니다; bpo-7333.)

    os.fork() 함수는 이제 자식 프로세스에서 임포트 잠금을 재초기화합니다. 이는 스레드로부터 (Zsolt Cserna가 수정; :issue:`7242().)

  • os.path 모듈에서 normpath()abspath() 함수는 이제 유니코드를 보존합니다. 입력 경로가 유니코드 문자열이면 반환 값도 유니코드 문자열입니다. (:meth:`~os.path.normpath`는 :issue:`5827`에서 Matt Giuca에 의해 수정되었고, :meth:`~os.path.abspath`는 :issue:`3426`에서 Ezio Melotti에 의해 수정되었습니다.)

  • pydoc 모듈에는 파이썬이 사용하는 다양한 심볼에 대한 도움말이 생겼습니다. 이제 예를 들어, help('<<') 또는 help('@') 를 할 수 있습니다. (David Laban 기여; bpo-4739.)

  • re 모듈의 split(), sub(), 및 :func:`~re.subn`은 이제 다른 함수들과 일관성을 위해 선택적 flags 인자를 받습니다. (Gregory P. Smith 추가.)

  • 새 함수: runpy 모듈의 py()), 컴파일된 바이트코드 파일 (example.pyc), 디렉터리 (./package/), 또는 zip 아카이브 (example.zip) 의 경로일 수 있습니다. 디렉터리나 zip 경로가 제공되면, 이는 sys.path 앞에 추가되며 __main__ 모듈이 임포트됩니다. 이 디렉터리나 zip에는 __main__.py`가 포함되어 있는 것이 기대되며; 그렇지 않다면, 나중에 ``sys.path``에서 다른 :file:`__main__.py`가 임포트될 있습니다. 이는 많은 수준의 :mod:`runpy 메커니즘을 파이썬 명령줄 프로세스가 명시적 경로 이름을 처리하는 방식을 모방하려는 스크립트에 사용할 수 있게 합니다. (Nick Coghlan 추가; bpo-6816.)

  • 새 함수: shutil 모듈의 :func:`~shutil.make_archive`는 파일 이름, 아카이브 형식(zip 또는 tar-format), 디렉터리 경로를 인수로 받아 해당 디렉터리의 내용을 포함하는 아카이브를 생성합니다. (Tarek Ziadé 추가.)

    shutil`의 :func:`~shutil.copyfilecopytree() 함수는 이제 이름 있는 파이프를 복사하도록 요청받을 때 SpecialFileError 예외를 발생시킵니다. 이전 코드에서는 이름 있는 파이프를 읽기 위해 열리는 일반 파일처럼 처리하여 무한정 블록되는 문제가 있었습니다. (Antoine Pitrou 수정; bpo-3002.)

  • signal 모듈은 더 이상 신호 핸들러를 재설치하지 않으며, 이는 EINTR 신호를 견고하게 포착하는 것을 불가능하게 만들 수 있는 버그를 수정했습니다. (Charles-Francois Natali 수정; bpo-8354.)

  • 새 함수: site 모듈에서 세 개의 새 함수가 다양한 사이트별 및 사용자별 경로를 반환합니다. USER_BASE() 환경 변수의 값을 반환합니다. (Tarek Ziadé 기여; bpo-6693.)

    site 모듈은 이제 sitecustomize 모듈이 임포트될 때 발생하는 예외를 보고하며, 더 이상 KeyboardInterrupt 예외를 잡고 무시하지 않습니다. (Victor Stinner 수정; bpo-3137.)

  • create_connection() 함수는 연결에 사용될 소스 주소를 제공하는 source_address 파라미터를 추가했습니다. 이 값은 (host, port) 형식의 2-튜플입니다. (Eldon Ziegler 기여; bpo-3972.)

    recv_into()recvfrom_into() 메서드는 이제 버퍼 API를 지원하는 객체, 가장 유용하게는 bytearraymemoryview 객체에 쓰게 됩니다. (Antoine Pitrou 구현; bpo-8104.)

  • The SocketServer module’s TCPServer class now supports socket timeouts and disabling the Nagle algorithm. The disable_nagle_algorithm class attribute defaults to False; if overridden to be true, new request connections will have the TCP_NODELAY option set to prevent buffering many small sends into a single TCP packet. The timeout class attribute can hold a timeout in seconds that will be applied to the request socket; if no request is received within that time, handle_timeout() will be called and handle_request() will return. (Contributed by Kristján Valur Jónsson; bpo-6192 and bpo-6267.)

  • 업데이트된 모듈: sqlite3 모듈이 pysqlite package <https://github.com/ghaering/pysqlite>`의 버전 2.6.0으로 업데이트되었습니다. 버전 2.6.0에는 여러 버그 수정 사항이 포함되어 있으며, 공유 라이브러리에서 SQLite 확장을 로드할 수 있는 기능이 추가되었습니다. 확장 기능을 사용하려면 ``enable_load_extension(True)` 메서드를 호출하고, 특정 공유 라이브러리를 로드하려면 :meth:`~sqlite3.Connection.load_extension`을 호출하십시오. (Gerhard Häring 업데이트.)

  • ssl 모듈의 SSLSocket 객체는 이제 버퍼 API를 지원합니다. 이는 테스트 스위트 실패를 수정하였으며 (Antoine Pitrou 수정; bpo-7133), OpenSSL의 SSL_MODE_AUTO_RETRY`를 자동으로 설정하여 SSL 재협상을 유발하는 :meth:!recv` 작업에서 오류 코드가 반환되는 것을 방지합니다 (Antoine Pitrou 수정; bpo-8222).

    wrap_socket() 생성자 함수는 이제 허용할 암호화 알고리즘을 나열하는 문자열인 ciphers 인수를 받습니다. 문자열 형식은 OpenSSL 문서 <https://docs.openssl.org/1.0.2/man1/ciphers/>에 설명되어 있습니다. (Antoine Pitrou 추가; bpo-8322.)

    또 다른 변경 사항은 확장 기능이 OpenSSL의 모든 암호 및 다이제스트 알고리즘을 로드하여 사용 가능하도록 하는 것입니다. 일부 SSL 인증서를 검증할 수 없어 “알 수 없는 알고리즘” 오류를 보고했습니다. (Beda Kosata가 보고하고 Antoine Pitrou가 수정함; bpo-8484.)

    사용 중인 OpenSSL 버전은 이제 모듈 속성으로 제공됩니다. ssl.OPENSSL_VERSION (문자열), ssl.OPENSSL_VERSION_INFO (5-튜플), 및 ssl.OPENSSL_VERSION_NUMBER (정수)입니다. (Antoine Pitrou 추가; bpo-8321.)

  • struct 모듈은 더 이상 값의 정수 형식 코드가 너무 커서 오버플로 오류를 무시하지 않습니다 (bBhHiIlLqQ 중 하나). 이제 항상 struct.error 예외를 발생시킵니다. (Mark Dickinson 변경; bpo-1523) 또한, pack() 함수는 오류를 보고하거나 __int__() 메서드를 시도하기 전에 비정수형을 변환하고 패킹하기 위해 __index__() 사용을 시도할 것입니다. (Mark Dickinson 변경; bpo-8300.)

  • 새 함수: subprocess 모듈의 CalledProcessError() 예외를 발생시킵니다.

    >>> subprocess.check_output(['df', '-h', '.'])
    'Filesystem     Size   Used  Avail Capacity  Mounted on\n
    /dev/disk0s2    52G    49G   3.0G    94%    /\n'
    
    >>> subprocess.check_output(['df', '-h', '/bogus'])
      ...
    subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1
    

    (Gregory P. Smith 기여.)

    subprocess 모듈은 이제 EINTR 신호를 수신하면 내부 시스템 호출을 재시도할 것입니다. (여러 사람이 보고함; Gregory P. Smith가 최종 패치 적용; bpo-1068268.)

  • 새 함수: symtable 모듈의 :func:`~symtable.Symbol.is_declared_global`은 명시적으로 전역으로 선언된 변수는 true를, 암묵적으로 전역인 변수는 false를 반환합니다. (Jeremy Hylton 기여.)

  • syslog 모듈은 이제 기본값이었던 'python' 대신 sys.argv[0] 의 값을 식별자로 사용합니다. (Sean Reifschneider 변경; bpo-8451.)

  • sys.version_info 값은 이제 named tuple이며, 속성 이름은 major, minor, micro, releaselevel, 및 serial`입니다. (Ross Light 기여; :issue:`4285).

    sys.getwindowsversion() also returns a named tuple, with attributes named major, minor, build, platform, service_pack, service_pack_major, service_pack_minor, suite_mask, and product_type. (Contributed by Brian Curtin; bpo-7766.)

  • The tarfile module’s default error handling has changed, to no longer suppress fatal errors. The default error level was previously 0, which meant that errors would only result in a message being written to the debug log, but because the debug log is not activated by default, these errors go unnoticed. The default error level is now 1, which raises an exception if there’s an error. (Changed by Lars Gustäbel; bpo-7357.)

    tarfile 이 이제 tar 파일에 추가되는 TarInfo 객체를 필터링하는 것을 지원합니다. add() 를 호출할 때, 선택적 filter 인자(호출 가능 함수)를 제공할 수 있습니다. 이 filter 호출 함수는 추가되는 모든 파일에 대한 TarInfo 객체를 전달받아 수정하고 반환할 수 있습니다. 호출 함수가 None 을 반환하면, 해당 파일은 결과 아카이브에서 제외됩니다. 이는 기존의 exclude 인자보다 더 강력한 기능이므로 비활성화되었습니다. (Added by Lars Gustäbel; bpo-6856.) 또한 TarFile 클래스는 이제 컨텍스트 관리 프로토콜을 지원합니다. (Added by Lars Gustäbel; bpo-7232.)

  • The wait() method of the threading.Event class now returns the internal flag on exit. This means the method will usually return true because wait() is supposed to block until the internal flag becomes true. The return value will only be false if a timeout was provided and the operation timed out. (Contributed by Tim Lesher; bpo-1674032.)

  • unicodedata 모듈에서 제공하는 유니코드 데이터베이스는 이제 어떤 문자가 숫자인지, 공백인지 또는 줄 바꿈을 나타내는지 결정하기 위해 내부적으로 사용됩니다. 이 데이터베이스에는 Unihan.txt 데이터 파일(Anders Chrigström 및 Amaury Forgeot d’Arc 패치; bpo-1571184)의 정보도 포함되어 있으며, 버전 5.2.0으로 업데이트되었습니다 (Florent Xicluna 업데이트; bpo-8024).

  • urlparse 모듈의 즉, URL이 `()”<something>://…”`` 형태라면, :// 이전 텍스트는 해당 모듈이 알지 못하는 가짜 스키마라 할지라도 스키마로 간주됩니다. 이 변경 사항은 기존 동작을 우회하던 코드를 손상시킬 수 있습니다. 예를 들어, Python 2.6.4나 2.5는 다음을 반환할 것입니다:

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', '', '//host/filename?query', '', '')
    

    Python 2.7 (및 Python 2.6.5)에서는 다음과를 반환합니다:

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', 'host', '/filename?query', '', '')
    

    (실제로는 named tuple을 반환하므로, Python 2.7은 약간 다른 출력을 생성합니다.)

    urlparse 모듈은 또한 RFC 2732 에 정의된 IPv6 리터럴 주소를 지원합니다 (Senthil Kumaran 기여; bpo-2987).

    >>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo')
    ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]',
                path='/foo', params='', query='', fragment='')
    
  • 새 클래스: weakref 모듈의 WeakSet 클래스는 요소에 대한 약한 참조만을 보유하는 집합입니다. 요소는 가리키는 참조가 없어지면 제거됩니다. (Raymond Hettinger에 의해 Python 3.x에서 처음 구현되었으며, Michael Foord에 의해 2.7로 백포팅되었습니다.)

  • xml.etree.ElementTree 라이브러리는 XML 처리 명령어(<?xml-stylesheet href="#style1"?> 처럼 보이는)나 주석(<!-- comment --> 처럼 보이는)을 출력할 때 더 이상 앰퍼샌드와 각 괄호를 이스케이프하지 않습니다. (Neil Muller 패치; bpo-2746.)

  • The XML-RPC client and server, provided by the xmlrpclib and SimpleXMLRPCServer modules, have improved performance by supporting HTTP/1.1 keep-alive and by optionally using gzip encoding to compress the XML being exchanged. The gzip compression is controlled by the encode_threshold attribute of SimpleXMLRPCRequestHandler, which contains a size in bytes; responses larger than this will be compressed. (Contributed by Kristján Valur Jónsson; bpo-6267.)

  • zipfile 모듈의 (Brian Curtin 기여; :issue:`5511.)

    zipfile`은 이제 디렉터리를 아카이빙하고 올바르게 추출하는 것도 지원합니다. (Kuba Wieczorek 수정판; :issue:`4710.) 아카이브에서 파일을 읽는 것이 더 빠르며, read() <io.BufferedIOBase.read>`와 :meth:`readline() <io.IOBase.readline>`를 상호 교차하여 사용하는 것도 이제 올바르게 작동합니다. (Nir Aides 기여; :issue:`7610().)

    is_zipfile() 함수는 이전 버전에서 허용된 경로 이름 외에도 파일 객체를 인수로 받습니다. (Gabriel Genellina 기여; bpo-4756.)

    writestr() 메서드는 이제 선택적 compress_type 매개변수를 가지게 되어, ZipFile 생성자에서 지정된 기본 압축 방식을 덮어쓸 수 있습니다. (Ronald Oussoren 기여; bpo-6003.)

새 모듈: importlib

Python 3.1부터는 Python의 import 구문 기저 로직을 재구현한 importlib 패키지를 포함합니다. importlib`은 파이썬 인터프리터를 구현하는 사람들과 가져오기 프로세스에 참여할 있는 새로운 임포터 작성을 원하는 사용자에게 유용합니다. Python 2.7에는 완전한 :mod:`importlib 패키지는 없지만, 대신 단일 함수인 :func:`~importlib.import_module`을 포함하는 작은 하위 집합이 있습니다.

import_module(name, package=None) 은 모듈을 가져옵니다. name 은 모듈 또는 패키지의 이름을 포함하는 문자열입니다. ..utils.errors 와 같이 . 문자로 시작하는 문자열을 제공하여 상대 임포트도 수행할 수 있습니다. 상대 임포트를 하는 경우, package 인수를 반드시 제공해야 하며 이는 상대 임포트의 앵커로 사용될 패키지의 이름입니다. import_module() 은 가져온 모듈을 sys.modules 에 삽입하고 해당 모듈 객체를 반환합니다.

다음은 몇 가지 예제입니다:

>>> from importlib import import_module
>>> anydbm = import_module('anydbm')  # 표준 절대 임포트
>>> anydbm
<module 'anydbm' from '/p/python/Lib/anydbm.py'>
>>> # 상대 임포트
>>> file_util = import_module('..file_util', 'distutils.command')
>>> file_util
<module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>

:mod:`importlib`은 Brett Cannon이 구현했으며 Python 3.1에 도입되었습니다.

새 모듈: sysconfig

sysconfig 모듈은 Distutils 패키지에서 분리되어 자체적인 최상위 모듈이 되었습니다. :mod:`sysconfig`는 파이썬의 빌드 과정에 대한 정보를 가져오는 함수를 제공합니다. 예: 컴파일러 스위칭, 설치 경로, 플랫폼 이름 및 파이썬이 소스 디렉터리에서 실행되는지 여부.

모듈의 일부 함수는 다음과 같습니다:

  • h() 파일에서 변수를 반환합니다.

  • :func:`~sysconfig.get_config_vars`는 모든 구성 변수를 담고 있는 딕셔너리를 반환합니다.

  • :func:`~sysconfig.get_path`는 특정 유형의 모듈에 대한 설정된 경로를 반환합니다. 예: 표준 라이브러리, 사이트별 모듈, 플랫폼별 모듈 등.

  • :func:`~sysconfig.is_python_build`는 파이썬 소스 트리에서 이진 파일을 실행하는 경우 true를 반환하고, 그렇지 않은 경우는 false를 반환합니다.

더 자세한 내용과 함수의 전체 목록은 sysconfig 문서를 참조하십시오.

Distutils 패키지와 :mod:`sysconfig`는 현재 Tarek Ziadé가 관리하고 있습니다. 그는 또한 Distutils의 차세대 버전을 개발하기 위한 새 Диstutils2 패키지(소스 저장소: https://hg.python.org/distutils2/)도 시작했습니다.

ttk: Tk용 테마형 위젯

Tcl/Tk 8.5에는 기본 Tk 위젯을 다시 구현하지만 더 사용자 정의 가능한 모양을 가져서 기본 플랫폼의 위젯과 더 가깝게 유사해질 수 있는 테마형 위젯 세트가 포함되어 있습니다. 이 위젯 세트는 원래 Tile이라고 불렸으나, Tcl/Tck 8.5 릴리스에 추가되면서 Ttk(“themed Tk”)로 이름이 변경되었습니다.

더 자세한 내용은 ttk 모듈 문서를 읽어보세요. 또한 https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html에서 사용할 수 있는 Ttk 테마 엔진을 설명하는 Tcl/Tk 매뉴얼 페이지를 읽는 것도 원할 수 있습니다. 사용 중인 Python/Ttk 코드의 스크린샷은 https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki에서 확인할 수 있습니다.

tkinter.ttk 모듈은 Guilherme Polo가 작성하고 bpo-2983 에 추가되었습니다. Martin Franklin이 작성하고 Kevin Walzer가 유지보수하는 Tile.py라는 대체 버전이 bpo-2618 포함을 위해 제안되었으나, 저자들은 Guilherme Polo의 작업이 더 포괄적이라고 주장했습니다.

업데이트된 모듈: unittest

unittest 모듈은 크게 향상되었으며, 많은 새로운 기능이 추가되었습니다. 이 기능들 중 대부분은 Michael Foord가 구현했으며 특별한 언급이 없는 경우를 제외하고 그렇습니다. 이 모듈의 향상된 버전은 Python 2.4부터 2.6용으로 별도로 다운로드하여 사용할 수 있으며, unittest2`에서 :mod:!unittest2` 패키지로 제공됩니다.

명령줄에서 사용하면 모듈이 테스트를 자동으로 발견할 수 있습니다. py.test <https://pytest.org>`__나 ` nose <https://nose.readthedocs.io/>`__만큼 화려하진 않지만, 일련의 패키지 디렉터리에 보관된 테스트를 실행하는 간단한 방법을 제공합니다. 예를 들어, 다음 명령어는 :file:`test/ 하위 디렉토리에서 test*.py 라는 이름의 임포트 가능한 모든 테스트 파일을 검색할 것입니다:

python -m unittest discover -s test

더 자세한 내용은 unittest 모듈 문서를 참조하세요. ( :issue:`6001`에 개발됨.)

main() 함수는 몇 가지 다른 새 옵션을 지원합니다:

  • -b 또는 :option:`!–buffer`는 각 테스트 중에 표준 출력 및 표준 에러 스트림을 버퍼링합니다. 테스트가 성공하면 결과적인 모든 출력은 무시되며, 실패 시에는 버퍼링된 출력이 표시됩니다.

  • -c 또는 :option:`!–catch`는 control-C 중단 처리를 더 우아하게 수행하도록 합니다. 테스트 프로세스를 즉시 인터럽트하는 대신, 현재 실행 중인 테스트가 완료된 후까지 부분적인 결과가 보고됩니다. 초조하다면, 두 번째 control-C 누름은 즉각적인 중단을 유발합니다.

    이 control-C 핸들러는 테스트 중인 코드 또는 실행 중인 테스트가 자체 시그널 핸들러를 정의했을 때 문제를 일으키지 않으려고 노력하며, 이미 시그널 핸들러가 설정되어 있음을 감지하고 이를 호출합니다. 이것이 작동하지 않는 경우, 제어-C 처리를 비활성화해야 하는 테스트를 표시하는 데 사용될 수 있는 removeHandler() 데코레이터가 있습니다.

  • -f 또는 --failfast`는 테스트를 계속 실행하는 대신, 테스트 실패 즉시 테스트 실행을 중지합니다. (Cliff Dyer가 제안하고 Michael Foord가 구현했습니다; :issue:`8074.)

진행 메시지는 이제 상세 모드에서 실행할 때 예상 실패에 대해 ‘x’를, 예상치 못한 성공에 대해 ‘u’를 표시합니다. (Benjamin Peterson 기여)

테스트 케이스는 테스트를 건너뛰기 위해 SkipTest 예외를 발생시킬 수 있습니다 (bpo-1034053).

assertEqual(), assertTrue(), 및 assertFalse() 실패에 대한 오류 메시지는 이제 더 많은 정보를 제공합니다. TestCase 클래스의 longMessage 속성을 True로 설정하면, 표준 에러 메시지와 사용자가 제공하는 모든 추가 메시지가 실패 시 인쇄됩니다. (Michael Foord가 추가함; bpo-5663.)

assertRaises() 메서드는 이제 callable 객체를 실행할 인자 없이 호출될 때 컨텍스트 핸들러를 반환합니다. 예로, 다음과 같이 작성할 수 있습니다:

with self.assertRaises(KeyError):
    {}['foo']

(Antoine Pitrou가 구현했습니다; bpo-4444.)

모듈 및 클래스 수준의 설정 및 정리 픽스쳐를 이제 지원합니다. 모듈은 setUpModule()tearDownModule() 함수를 포함할 수 있습니다. 클래스는 반드시 클래스 메서드로 정의되어야 하는 setUpClass()tearDownClass() 메서드를 가질 수 있습니다. 이 함수와 메서드는 테스트 러너가 다른 모듈이나 클래스의 테스트 케이스로 전환될 때 호출됩니다.

The methods addCleanup() and doCleanups() were added. addCleanup() lets you add cleanup functions that will be called unconditionally (after setUp() if setUp() fails, otherwise after tearDown()). This allows for much simpler resource allocation and deallocation during tests (bpo-5679).

더 전문화된 테스트를 제공하는 여러 새 메서드가 추가되었습니다. 이 중 많은 메서드는 Google 엔지니어들에 의해 그들의 테스트 스위트에서 사용하기 위해 작성되었으며; Gregory P. Smith, Michael Foord, 그리고 GvR이 이를 Python의 unittest 버전으로 통합하는 작업을 했습니다.

  • assertIsNone()assertIsNotNone() 은 하나의 표현식을 받아 그 결과가 None 이거나 None 이 아님을 검사합니다.

  • assertIs() (Michael Foord가 추가했습니다; :issue:`2578().)

  • assertIsInstance() (Georg Brandl이 추가했습니다; :issue:`7031().)

  • assertGreater(), assertGreaterEqual(), assertLess(), 그리고 :meth:`~unittest.TestCase.assertLessEqual`는 두 양을 비교합니다.

  • :meth:`~unittest.TestCase.assertMultiLineEqual`은 두 문자열을 비교하며, 동일하지 않은 경우 두 문자열의 차이점을 강조 표시하는 유용한 비교를 표시합니다. 이 비교는 이제 Unicode 문자열을 비교할 때 :meth:`~unittest.TestCase.assertEqual`에서 기본적으로 사용됩니다.

  • assertRegexpMatches()assertNotRegexpMatches() <unittest.TestCase.assertNotRegex>`는 번째 인자가 번째 인자로 제공된 정규 표현식과 일치하는 문자열인지, 또는 일치하지 않는지를 검사합니다 (:issue:`8038()).

  • :meth:`assertRaisesRegexp() <unittest.TestCase.assertRaisesRegex>`는 특정 예외가 발생하는지 확인하고, 나아가 예외의 문자열 표현이 제공된 정규 표현식과 일치하는지도 확인합니다.

  • assertIn()assertNotIn()firstsecond 에 포함되는지 여부를 테스트합니다.

  • :meth:`assertItemsEqual() <unittest.TestCase.assertCountEqual>`는 제공된 두 시퀀스가 동일한 요소를 포함하는지 테스트합니다.

  • :meth:`~unittest.TestCase.assertSetEqual`은 두 집합이 같은지 비교하며, 오류가 발생할 경우 집합 사이의 차이점만을 보고합니다.

  • 마찬가지로, assertListEqual() 및 :meth:`~unittest.TestCase.assertTupleEqual`은 지정된 타입을 비교하며 전체 값을 반드시 출력하지 않고도 어떤 차이가 있는지 설명합니다. 이 메서드들은 이제 list와 tuple을 :meth:`~unittest.TestCase.assertEqual`로 비교할 때 기본적으로 사용됩니다. 더 일반적으로, :meth:`~unittest.TestCase.assertSequenceEqual`는 두 시퀀스를 비교하며 옵션으로 두 시퀀스 모두가 특정 타입인지 확인할 수 있습니다.

  • assertDictEqual() 은 두 딕셔너리를 비교하고 차이점을 보고합니다. 이 메서드는 이제 assertEqual() 을 사용하여 두 딕셔너리를 비교할 때 기본적으로 사용됩니다. assertDictContainsSubset()first 에 있는 모든 키/값 쌍이 second 에 포함되어 있는지 확인합니다.

  • :meth:`~unittest.TestCase.assertAlmostEqual`과 :meth:`~unittest.TestCase.assertNotAlmostEqual`은 first*와 *second*가 근사적으로 같은지 테스트합니다. 이 메서드는 기본값인 *places*(7)로 그 차이를 지정적으로 반올림하여 0과 비교하거나, 주어진 *delta 값보다 작아야 하는지 요구할 수 있습니다.

  • loadTestsFromName() properly honors the suiteClass attribute of the TestLoader. (Fixed by Mark Roddy; bpo-6866.)

  • 새로운 훅이 assertEqual() 메서드를 확장하여 새로운 데이터 유형을 처리할 수 있게 합니다. addTypeEqualityFunc() 메서드는 타입 객체와 함수를 인수로 받습니다. 이 함수는 비교되는 두 객체가 지정된 타입일 때 사용됩니다. 이 함수는 두 객체를 비교하고 일치하지 않으면 예외를 발생시켜야 하며, 새로운 시퀀스 비교 메서드들이 하는 것처럼 왜 두 객체가 일치하지 않는지에 대한 추가 정보를 제공하는 것이 좋습니다.

unittest.main`은 이제 선택적인 ``exit`() 인수를 받습니다. 이 값이 false인 경우, Pablo Fernández가 기여함; :issue:`3379().)

startTestRun (Robert Collins가 기여함; :issue:`5728().)

위의 모든 변경사항들로 인해, :file:`unittest.py`는 다루기 어려울 정도로 커지고 있었으므로 모듈은 패키지로 나뉘었으며 코드는 여러 파일로 분리되었습니다 (Benjamin Peterson). 이는 해당 모듈이 가져오거나 사용하는 방식에는 영향을 미치지 않습니다.

더 보기

https://web.archive.org/web/20210619163128/http://www.voidspace.org.uk/python/articles/unittest2.shtml

새로운 기능, 사용 방법 및 다양한 설계 결정의 근거를 설명합니다. (Michael Foord 작성.)

업데이트된 모듈: ElementTree 1.3

Python에 포함된 ElementTree 라이브러리 버전이 1.3으로 업데이트되었습니다. 새로운 기능 중 일부는 다음과 같습니다:

  • 여러 구문 분석 함수들이 이제 parser 키워드 인수를 받아 XMLParser 인스턴스를 사용하게 됩니다. 이를 통해 파일의 내부 인코딩을 재정의하는 것이 가능해집니다:

    p = ET.XMLParser(encoding='utf-8')
    t = ET.XML("""<root/>""", parser=p)
    

    XML 파싱 중 발생하는 오류는 이제 ParseError 예외를 발생시키며, 이 인스턴스는 문제의 위치를 포함하는 (line, column) 튜플을 가진 position 속성을 가집니다.

  • ElementTree가 트리를 문자열로 변환하는 코드가 크게 개선되어 많은 경우 약 두 배 더 빨라졌습니다. 이제 ElementTree.write()Element.write() 메서드는 “xml”(기본값), “html”, 또는 “text”가 될 수 있는 method 인수를 가집니다. HTML 모드는 빈 요소를 <empty></empty> 로 출력하며, 텍스트 모드에서는 요소는 건너뛰고 텍스트 청크만 출력합니다. 만약 요소의 tag 속성을 None 으로 설정하지만 자식 요소는 그대로 두면, 해당 요소는 트리가 작성될 때 생략되므로 단일 요소를 제거하기 위해 광범위한 재배열을 할 필요가 없습니다.

    네임스페이스 처리도 개선되었습니다. 모든 xmlns:<whatever> 선언은 이제 결과 XML의 루트 요소에 출력되며, 여기저기 흩어지지 않습니다. default_namespace 속성을 설정하여 트리의 기본 네임스페이스를 지정할 수 있으며, :meth:`~xml.etree.ElementTree.register_namespace`를 사용하여 새로운 접두사를 등록할 수 있습니다. XML 모드에서는 true/false xml_declaration 매개변수를 사용하여 XML 선언을 억제할 수 있습니다.

  • 새로운 Element 메서드: :meth:`~xml.etree.ElementTree.Element.extend`는 시퀀스에서 항목을 요소의 자식에게 추가합니다. 요소 자체도 시퀀스처럼 동작하므로, 한 요소의 자식을 다른 요소로 이동하기 쉽습니다:

    from xml.etree import ElementTree as ET
    
    t = ET.XML("""<list>
      <item>1</item> <item>2</item>  <item>3</item>
    </list>""")
    new = ET.XML('<root/>')
    new.extend(t)
    
    # 출력이 <root><item>1</item>...</root>가 됩니다.
    print ET.tostring(new)
    
  • 새로운 Element 메서드: 기존 메서드인 :meth:()!getiterator`는 더 이상 사용되지 않으며, 자식 리스트를 구성하여 반환하는 :meth:`!getchildren`도 마찬가지입니다.

  • 새로운 Element 메서드: :meth:`~xml.etree.ElementTree.Element.itertext`는 요소의 하위 모든 텍스트 조각을 반환합니다. 예를 들어:

    t = ET.XML("""<list>
      <item>1</item> <item>2</item>  <item>3</item>
    </list>""")
    
    # 출력이 ['\n  ', '1', ' ', '2', '  ', '3', '\n']가 됩니다.
    print list(t.itertext())
    
  • 더 이상 사용되지 않습니다: 요소를 불리언으로 사용(즉, if elem:)하면 요소에 자식이 있으면 True를 반환하고, 자식이 없으면 False를 반환합니다. 이 동작은 혼란스러운데요 – None 은 False이지만, 자식이 없는 요소도 False인 것이 맞을까요? — 따라서 이제 FutureWarning 이 발생합니다. 코드에서 자식의 개수가 궁금하다면 len(elem) != 0 를 명시적으로 작성하거나, elem is not None 을 사용해야 합니다.

Fredrik Lundh가 ElementTree를 개발하여 1.3 버전을 만들었으며, 1.3에 대한 설명을 담은 그의 글은 https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm에서 읽을 수 있습니다. Florent Xicluna는 python-dev와 :issue:`6472`의 논의 이후 파이썬에 포함되는 버전을 업데이트했습니다.)

빌드 및 C API 변경사항

파이썬의 빌드 프로세스와 C API에 대한 변경 사항은 다음과 같습니다:

  • GNU 디버거 GDB 7의 최신 버전은 Python을 사용하여 scripted using Python <https://web.archive.org/web/20110715084810/http://sourceware.org/gdb/current/onlinedocs/gdb/Python.html> 를 통해 사용할 수 있습니다. 실행 가능한 프로그램 P의 디버깅을 시작하면 GDB는 P-gdb.py 라는 파일을 찾아서 자동으로 읽습니다. Dave Malcolm이 Python 자체를 디버깅할 때 유용한 여러 명령어를 추가한 python-gdb.py 파일을 기여하였습니다. 예를 들어, py-uppy-down 은 파이썬 스택 프레임을 하나 위 또는 아래로 이동하며, 이는 일반적으로 몇 개의 C 스택 프레임에 해당합니다. py-print 는 파이썬 변수의 값을 출력하고, py-bt 는 파이썬 스택 트레이스를 출력합니다. ( bpo-8032 의 결과로 추가되었습니다.)

  • Python과 함께 제공되는 .gdbinit 파일을 사용하면, 디버깅 중인 스레드가 GIL을 보유하고 있지 않은 경우 2.7 버전의 “pyo” 매크로가 이제 올바르게 작동합니다. 이 매크로는 출력하기 전에 GIL을 획득합니다. (Victor Stinner 기여; bpo-3632.)

  • Py_AddPendingCall() 은 이제 스레드 안전(thread-safe)하여 모든 워커 스레드가 메인 파이썬 스레드에 알림을 제출할 수 있습니다. 이는 비동기 I/O 작업에 특히 유용합니다. (Kristján Valur Jónsson 기여; bpo-4293.)

  • 새 함수: PyCode_NewEmpty() 는 빈 코드 객체를 생성합니다. 파일 이름, 함수 이름 및 첫 번째 줄 번호만 필요합니다. 이는 더 유용한 트레이스백 스택을 구성하려는 확장 모듈에 유용합니다. 이전에는 이러한 확장이 훨씬 더 많은 인수가 필요한 PyCode_New() 를 호출해야 했습니다. (Jeffrey Yasskin 추가.)

  • 새 함수: PyErr_NewExceptionWithDoc() 은 새로운 예외 클래스를 생성하며(기존의 PyErr_NewException() 과 유사), 새 예외 클래스의 독스트링을 포함하는 추가적인 char * 인자를 받습니다. (Python 버그 추적기에 ‘lekma’가 추가함; bpo-7033.)

  • 새 함수: :c:func:`PyFrame_GetLineNumber`는 프레임 객체를 받아 해당 프레임이 현재 실행 중인 줄 번호를 반환합니다. 이전에는 코드가 현재 실행 중인 바이트코드 명령어의 인덱스를 가져온 다음, 그 주소에 해당하는 줄 번호를 찾아야 했습니다. (Jeffrey Yasskin 추가됨.)

  • 새 함수들: PyLong_AsLongAndOverflow()PyLong_AsLongLongAndOverflow() 는 파이썬 긴 정수를 C의 long 또는 long long 으로 근사합니다. 숫자가 출력 유형에 맞지 않아 너무 큰 경우, overflow 플래그가 설정되어 호출자에게 반환됩니다. (Case Van Horsen 기여자; bpo-7528bpo-7767.)

  • 새 함수: 문자열-실수 변환을 다시 작성하면서 새로운 PyOS_string_to_double() 함수가 추가되었습니다. 기존의 PyOS_ascii_strtod()PyOS_ascii_atof() 함수는 이제 사용이 중단됩니다.

  • 새 함수: PySys_SetArgvEx()sys.argv 값을 설정하며, updatepath 매개변수의 값에 따라 스크립트 이름인 sys.argv[0] 을 포함하는 디렉토리를 sys.path 에 선택적으로 업데이트할 수 있습니다.

    이 함수는 파이썬을 임베드하는 애플리케이션의 보안 취약점을 닫기 위해 추가되었습니다. 구(舊) 함수인 PySys_SetArgv() 는 항상 sys.path 를 업데이트했으며, 때로는 현재 디렉토리를 추가했습니다. 이는 파이썬을 임베드하는 애플리케이션을 다른 누군가가 제어하는 디렉토리에서 실행할 경우, 공격자가 트로이 목마 모듈(예: os.py 라는 이름의 파일)을 해당 디렉토리에 넣고, 애플리케이션이 이를 가져와 실행할 수 있음을 의미했습니다.

    Python을 임베드하는 C/C++ 애플리케이션을 유지 관리하고 있다면, PySys_SetArgv`를 호출하고 있는지 확인하고, *updatepath*를 false로 설정하여 :c:func:()!PySys_SetArgvEx`를 사용하는 것이 적절한지 신중하게 검토하십시오.

    보안 문제로 알려진 내용입니다. (CVE-2008-5983); :issue:`5753`에서 논의되었으며 Antoine Pitrou에 의해 수정되었습니다.

  • 새 매크로: 파이썬 헤더 파일에는 이제 다음과 같은 매크로가 정의되어 있습니다: Py_ISALNUM, Py_ISALPHA, Py_ISDIGIT, Py_ISLOWER, Py_ISSPACE, Py_ISUPPER, Py_ISXDIGIT, Py_TOLOWER, 그리고 Py_TOUPPER. 이 모든 함수는 문자 분류를 위한 C 표준 매크로와 유사하지만, 여러 곳에서 파이썬은 로케일과 독립적인 방식으로 문자를 분석해야 하므로 현재 로케일 설정을 무시합니다. (Eric Smith 추가됨; bpo-5793.)

  • 삭제된 함수: PyEval_CallObject`는 이제 매크로로만 사용할 있습니다. 함수 버전은 ABI 링크 호환성을 유지하기 위해 보존되었지만, 그것은 1997년의 것이므로 지금쯤 삭제될 있습니다. (Antoine Pitrou에 의해 삭제됨; :issue:`8276().)

  • 새 형식 코드: PyString_FromFormat(), PyString_FromFormatV(), 및 PyErr_Format() 함수는 C의 long long 타입을 표시하기 위해 %lld``와 ``%llu 형식 코드를 받습니다. (Mark Dickinson 기여자; bpo-7228.)

  • 스레드와 프로세스 포킹 간의 복잡한 상호 작용이 변경되었습니다. 이전에는 :func:`os.fork`로 생성된 자식 프로세스가 문제가 발생할 수 있었습니다. 왜냐하면 해당 자식은 :func:`os.fork`를 수행하는 스레드만 단일하게 실행되면서 생성되었기 때문입니다. 만약 다른 스레드가 파이썬의 import lock과 같은 잠금을 보유하고 있었다면, 포크가 수행될 때 이 잠금은 새 프로세스에서 여전히 “점유됨”으로 표시될 것입니다. 그러나 자식 프로세스에서는 다른 스레드들이 복사되지 않았기 때문에 아무도 이 잠금을 해제하지 못할 것이고, 자식 프로세스는 더 이상 임포트를 수행할 수 없게 됩니다.

    Python 2.7 acquires the import lock before performing an os.fork(), and will also clean up any locks created using the threading module. C extension modules that have internal locks, or that call fork() themselves, will not benefit from this clean-up.

    (Thomas Wouters에 의해 수정되었습니다; bpo-1590864.)

  • The Py_Finalize() function now calls the internal threading._shutdown() function; this prevents some exceptions from being raised when an interpreter shuts down. (Patch by Adam Olsen; bpo-1722344.)

  • 타입의 속성을 정의할 때 :c:type:`PyMemberDef 구조를 사용하면, 파이썬은 더 이상 :c:macro:!T_STRING_INPLACE` 속성을 삭제하거나 설정하도록 허용하지 않습니다.

  • :mod:`ctypes 모듈에 의해 정의된 전역 심볼들은 이제 Py 또는 _ctypes 접두사로 시작합니다. (Thomas Heller가 구현했습니다; bpo-3102.)

  • 새 컨피그 옵션: :option:!–with-system-expat` 스위치는 :mod:`pyexpat <xml.parsers.expat> 모듈이 시스템 Expat 라이브러리를 사용하도록 빌드할 수 있게 합니다. (Arfrever Frehtes Taifersar Arahesis가 기여했습니다; bpo-7609.)

  • 새 컨피그 옵션: :option:!–with-valgrind` 옵션은 현재 pymalloc 할당자를 비활성화합니다. 이는 Valgrind 메모리 오류 감지기가 올바르게 분석하기 어렵기 때문입니다. 따라서 Valgrind가 메모리 누수 및 오버런을 탐지하는 데 더 좋을 것입니다. (James Henstridge가 기여했습니다; bpo-2422.)

  • 새 컨피그 옵션: :option:!–with-dbmliborder=`에 빈 문자열을 제공하여 모든 다양한 DBM 모듈을 비활성화할 수 있습니다. (Arfrever Frehtes Taifersar Arahesis가 추가했습니다; bpo-6491.)

  • :program:configure 스크립트는 이제 특정 32비트 인텔 칩에서 부동 소수점 반올림 버그를 확인하고, :c:macro:!X87_DOUBLE_ROUNDING` 전처리기 정의를 설정합니다. 현재 코드는 이 정의를 사용하지 않지만, 누구나 사용할 수 있습니다. (Mark Dickinson이 추가했습니다; bpo-2937.)

    :program:configure`는 이제 C++ 링크를 지원하는 `:envvar:!LDCXXSHARED` Makefile 변수를 설정합니다. (Arfrever Frehtes Taifersar Arahesis가 기여했습니다; bpo-1222585.)

  • 빌드 프로세스가 이제 pkg-config 지원에 필요한 파일들을 생성합니다. (Clinton Roy가 기여했습니다; bpo-3585.)

  • 빌드 프로세스가 Subversion 1.7을 지원하도록 변경되었습니다. (Arfrever Frehtes Taifersar Arahesis가 기여했습니다; bpo-6094.)

캡슐

Python 3.1은 확장 모듈에 C API를 제공하기 위해 새로운 C 데이터 타입 :c:type:`PyCapsule`을 추가합니다. 캡슐은 본질적으로 C ``void *` 포인터를 담는 컨테이너이며, 모듈 속성으로 사용할 수 있습니다. 예를 들어, :mod:`socket 모듈의 API가 socket.CAPI`로 노출되고, `:mod:`unicodedata`는 ``ucnhash_CAPI``를 노출합니다. 다른 확장 모듈은 모듈을 임포트하여 딕셔너리에 접근해 캡슐 객체를 가져온 다음, ``void * 포인터를 얻게 되는데, 일반적으로 이는 모듈의 다양한 API 함수들에 대한 포인터 배열을 가리킵니다.

이 용도로 이미 사용되는 :c:type:!PyCObject`이라는 데이터 타입이 있지만, 이것은 타입 안전성을 제공하지 않습니다. 순수 Python으로 작성된 악성 코드는 모듈 A의 :c:type:!PyCObject`을 가져와 어떤 방식으로든 모듈 B의 :c:type:!PyCObject` 대신 취함으로써 세그멘테이션 폴트를 유발할 수 있습니다. 캡슐은 자신의 이름을 알고 있으며, 포인터를 얻으려면 이 이름과 함께 제공해야 합니다.

void *vtable;

if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
        PyErr_SetString(PyExc_ValueError, "argument type invalid");
        return NULL;
}

vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");

You are assured that vtable points to whatever you’re expecting. If a different capsule was passed in, PyCapsule_IsValid() would detect the mismatched name and return false. Refer to 확장 모듈을 위한 C API 제공하기 for more information on using these objects.

Python 2.7 now uses capsules internally to provide various extension-module APIs, but the PyCObject_AsVoidPtr() was modified to handle capsules, preserving compile-time compatibility with the PyCObject interface. Use of PyCObject_AsVoidPtr() will signal a PendingDeprecationWarning, which is silent by default.

Python 3.1에서 구현되었으며 Larry Hastings가 2.7로 역포팅했습니다; :issue:`5630`에서 논의되었습니다.

포트별 변경 사항: Windows

  • msvcrt — MS VC++ 런타임의 유용한 루틴을 포함하는 몇 가지 상수들 CRT_ASSEMBLY_VERSION, VC_ASSEMBLY_PUBLICKEYTOKEN, 및 (David Cournapeau 기여; :issue:`4365.)

  • 레지스트리 액세스를 위한 _winreg 모듈에서 이제 CreateKeyEx()DeleteKeyEx() 함수가 구현되어, 이들은 기존 지원 함수들의 확장 버전으로 몇 가지 추가 인수를 받습니다 (추가된 인수 포함). 또한, DisableReflectionKey(), EnableReflectionKey(), 및 (Brian Curtin 구현: :issue:`7347().)

  • 새로운 _beginthreadex() API를 사용하여 스레드를 시작하며, 이제 네이티브 스레드 로컬 저장소 함수가 사용됩니다. (Kristján Valur Jónsson 기여; bpo-3582.)

  • os.kill() 함수는 이제 Windows에서 작동합니다. 시그널 값은 상한 수치인 CTRL_C_EVENT, CTRL_BREAK_EVENT, 또는 임의의 정수일 수 있습니다. 앞의 두 상수는 하위 프로세스에 각각 Control-CControl-Break 키 입력 이벤트를 전송하며, 다른 값은 TerminateProcess() API를 사용합니다. (Miki Tebeka 기여; bpo-1220212.)

  • os.listdir() 함수는 이제 빈 경로에 대해 올바르게 실패 방지합니다. (Hirokazu Yamamoto 수정: bpo-5913.)

  • mimetypes 모듈은 초기화 시 Windows 레지스트리에서 MIME 데이터베이스를 읽게 됩니다. (Gabriel Genellina 패치; bpo-4969.)

포트별 변경 사항: Mac OS X

  • 패키지를 시스템 설치와 사용자 설치본 간에 공유하기 위해 경로 /Library/Python/2.7/site-packages 가 이제 sys.path 에 추가됩니다. (Ronald Oussoren 변경: bpo-4865.)

    버전 2.7.13에서 변경: 2.7.13 버전부터 이 변경 사항은 제거되었습니다. Apple에서 제공하는 시스템 Python 2.7에 사용되는 site-packages 디렉터리인 /Library/Python/2.7/site-packages 는 이제 python.org 설치 관리자와 같은 사용자 설치 Python의 sys.path 에 추가되지 않습니다. macOS 10.12부터 Apple은 시스템 site-packages 디렉터리가 구성되는 방법을 변경했으며, 이는 setuptools와 같은 pip 컴포넌트 설치 실패를 야기할 수 있습니다. 시스템 Python용으로 설치된 패키지는 더 이상 사용자 설치 Python과 공유되지 않습니다. (bpo-28440)

포트별 변경 사항: FreeBSD

  • FreeBSD 7.1의 SO_SETFIB 상수는 라우팅 테이블을 선택하는 데 socket() 메서드에 사용되며, 이는 socket 모듈에서 사용할 수 있게 되었습니다. (Kyle VanderBeek 추가: bpo-8235.)

기타 변경 사항 및 수정 사항

  • 두 개의 벤치마크 스크립트인 iobench`와 :file:`ccbench`가 :file:`Tools 디렉터리에 추가되었습니다. :file:`iobench`는 다양한 작업을 수행하면서 내장 파일 I/O 객체(open()에 의해 반환됨)의 속도를 측정하며, :file:`ccbench`는 가변 개수의 스레드를 사용하여 여러 작업을 수행할 때 컴퓨팅 처리량, 스레드 전환 지연 시간 및 I/O 처리 대역폭을 측정하는 동시성 벤치마크입니다.

  • Tools/i18n/msgfmt.py 스크립트가 이제 .po 파일의 복수형을 이해합니다. (Martin von Löwis 수정: bpo-5464.)

  • .pyc 또는 .pyo 파일을 불러오는 과정에서 해당한 .py 파일이 존재할 경우, 원본 파일 이름이 더 이상 사용되지 않는 경우 반환된 코드 객체의 co_filename 속성이 덮어쓰여집니다. 이는 파일 이름이 변경되거나 이동되었거나 다른 경로를 통해 액세스된 경우 발생할 수 있습니다. (Ziga Seilnacht 및 Jean-Paul Calderone 패치; bpo-1180193.)

  • regrtest.py 스크립트가 이제 프로세스에 무작위 순서로 테스트를 실행하는 :option:!–randseed=` 옵션을 받습니다. 이는 정수 값을 받아와 랜덤 시드 값으로 사용됩니다. 또한 이 프레젠테이션에서는 사용된 시드도 보고합니다. (Collin Winter 추가.)

  • regrtest.py 스위치 중 또 하나인 -j`는 병렬로 실행되는 테스트 수를 지정하는 정수를 받습니다. 이를 통해 멀티 코어 장비에서 전체 실행 시간을 줄일 있습니다. 옵션은 오랜 실행 시간이 발생하는 것으로 알려진 :option:!-R` 스위치를 포함한 다른 여러 옵션과 호환됩니다. (Antoine Pitrou 추가, bpo-6152.) 또한 선택된 테스트를 실패할 때까지 루프 실행하는 새로운 -F 스위치와도 사용할 수 있습니다. (Antoine Pitrou 추가; bpo-7312.)

  • 스크립트로 실행될 때, py_compile.py_ 모듈은 이제 '-' 을 인수로 받으며, 이 경우 컴파일할 파일 목록을 표준 입력으로부터 읽어옵니다. (Piotr Ożarowski 추가; bpo-8233.)

Python 2.7로 이식하기

본 섹션은 코드 변경이 필요할 수 있는 이전에 설명한 변경 사항과 기타 버그 수정 사항을 나열합니다:

  • range() 함수는 인수를 더 일관되게 처리합니다. 이제 :meth:`~object.__int__`를 부동 소수점이 아니거나 정수가 아닌 인수에 대해 호출합니다. (Alexander Belopolsky 수정; :issue:`1533.)

  • 문자열 format() 메서드는 부동 소수점 및 복소수의 기본 정밀도를 6자리에서 12자리로 변경했습니다. 이는 str`가 사용하는 정밀도와 일치합니다. (Eric Smith 변경; :issue:`5920().)

  • with 문에 대한 최적화 때문에, 특수 메서드인 이는 뉴스타일 클래스 (':class:`object()’에서 파생됨) 및 C 확장 유형에 영향을 미칩니다. (bpo-6101.)

  • Python 2.6의 버그로 인해, __exit__() 메서드의 exc_value 매개변수는 자주 예외 인스턴스가 아닌 예외의 문자열 표현이었습니다. 이는 2.7에서 수정되어 exc_value 는 예상대로 인스턴스가 됩니다. (Florent Xicluna 수정; bpo-7853.)

  • 제한된 속성 세트가 __slots__ 를 사용하여 설정되었을 때, 설정되지 않은 속성을 삭제해도 기대했던 대로 AttributeError 를 발생시키지 않습니다. Benjamin Peterson이 수정했습니다; bpo-7604.)

표준 라이브러리:

  • 지원되는 범위를 벗어나는 연도가 발생하는 datetime 인스턴스 작업은 항상 OverflowError`를 발생시키지 않았습니다. 이러한 오류는 이제 주의 깊게 확인되며, 예외를 발생시킵니다. (Mark Leander 보고, Anand B. Pillai Alexander Belopolsky 패치; :issue:`7150.)

  • 문자열의 format() 메서드를 사용하여 Decimal 인스턴스를 사용할 때, 기본 정렬 방식은 이전에 왼쪽 정렬이었습니다. 이는 오른쪽 정렬로 변경되어 프로그램의 출력을 변경할 수 있습니다. (Mark Dickinson 변경; bpo-6857.)

    신호 NaN 값 (또는 sNAN)을 포함하는 비교 연산은 이제 비교 연산자에 따라 참 또는 거짓 값을 조용히 반환하는 대신 Quiet NaN (또는 ``NaN`)도 이제 해시 가능합니다. (:issue:`7279`에 의해 Mark Dickinson가 수정함.)

  • xml.etree.ElementTree 라이브러리는 더 이상 XML 처리 명령(<?xml-stylesheet href="#style1"?> 모양)이나 주석(<!-- comment --> 모양)을 출력할 때 앰퍼샌드와 각도 괄호를 이스케이프하지 않습니다. (Neil Muller 패치; bpo-2746.)

  • StringIO 객체의 readline() 메서드는 다른 파일 유사 객체들과 마찬가지로 음수 길이가 요청될 때 아무것도 하지 않습니다. (bpo-7348).

  • syslog 모듈은 이제 기본값이었던 'python' 대신 sys.argv[0] 의 값을 식별자로 사용합니다. (Sean Reifschneider 변경; bpo-8451.)

  • The tarfile module’s default error handling has changed, to no longer suppress fatal errors. The default error level was previously 0, which meant that errors would only result in a message being written to the debug log, but because the debug log is not activated by default, these errors go unnoticed. The default error level is now 1, which raises an exception if there’s an error. (Changed by Lars Gustäbel; bpo-7357.)

  • urlparse 모듈의 즉, URL이 `()”<something>://…”`` 형태라면, :// 이전 텍스트는 해당 모듈이 알지 못하는 가짜 스키마라 할지라도 스키마로 간주됩니다. 이 변경 사항은 기존 동작을 우회하던 코드를 손상시킬 수 있습니다. 예를 들어, Python 2.6.4나 2.5는 다음을 반환할 것입니다:

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', '', '//host/filename?query', '', '')
    

    Python 2.7 (및 Python 2.6.5)에서는 다음과를 반환합니다:

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', 'host', '/filename?query', '', '')
    

    (실제로는 named tuple을 반환하므로, Python 2.7은 약간 다른 출력을 생성합니다.)

C 확장의 경우:

  • 정수 형식 코드를 PyArg_Parse* 계열 함수와 사용하는 C 확장 프로그램은 이제 DeprecationWarning`을 발생시키는 대신 :exc:`TypeError 예외를 발생시킵니다 (bpo-5080).

  • 더 이상 사용되지 않는 이전의 PyOS_ascii_strtod()PyOS_ascii_atof() 함수 대신, 새로운 PyOS_string_to_double() 함수를 사용하세요.

Python을 임베드하는 애플리케이션의 경우:

  • PySys_SetArgvEx() 함수가 추가되어, 기존 PySys_SetArgv() 함수를 사용했을 때 애플리케이션이 보안 구멍을 닫도록 했습니다. PySys_SetArgv() 호출 여부를 확인하고, updatepath 를 false로 설정하여 해당 애플리케이션이 PySys_SetArgvEx() 를 사용해야 할지 신중하게 고려하세요.

Python 2.7 유지보수 릴리스에 추가된 새로운 기능

상황이 진정으로 요구하는 경우에 한하여 Python 2.7 유지보수 릴리스에 새로운 기능이 추가될 수 있습니다. 이러한 추가 사항은 반드시 파이썬 기능 제안(Python Enhancement Proposal) 프로세스를 거쳐야 하며, 단순히 Python 3에만 새로운 기능을 추가하거나 Python Package Index에 배포하는 것보다 왜 이래야 하는지에 대해 설득력 있는 근거를 제시해야 합니다.

아래 나열된 특정 제안 외에도, 모든 Python 2.7 유지보수 릴리스에 새로운 -3 경고를 추가할 수 있도록 하는 일반적인 예외 조항이 존재합니다.

디버그 모드를 위한 두 개의 새로운 환경 변수

디버그 모드에서는 기본적으로 [xxx refs] 통계가 작성되지 않으며, 이제 PYTHONSHOWREFCOUNT 환경 변수도 설정해야 합니다. (Victor Stinner 기여; bpo-31733.)

Python을 COUNT_ALLOC 이 정의된 상태로 컴파일하면, 할당 카운트가 더 이상 기본적으로 덤프되지 않습니다: 이제 PYTHONSHOWALLOCCOUNT 환경 변수도 설정해야 합니다. 또한, 할당 카운트는 stdout 대신 stderr로 덤프됩니다. (Victor Stinner 기여; bpo-31692.)

Added in version 2.7.15.

PEP 434: 모든 브랜치에 대한 IDLE 향상 예외 조항

:pep:`434`는 Python과 함께 제공되는 IDLE 개발 환경에 변경 사항이 있는 경우에 대한 일반적인 예외를 설명합니다. 이 예외는 IDLE 개발자들이 지원되는 모든 버전의 Python 2 및 3에서 더욱 일관된 사용자 경험을 제공할 수 있도록 합니다.

IDLE 변경 사항에 대한 자세한 내용은 해당 릴리스의 NEWS 파일을 참조하십시오.

PEP 466: Python 2.7용 네트워크 보안 향상 기능

:pep:`466`은 Python 2.7 유지보수 릴리스에 포함되도록 승인된 여러 네트워크 보안 향상 제안 사항을 설명하며, 이러한 변경 사항 중 첫 번째는 Python 2.7.7 릴리스에서 나타납니다.

PEP 466 관련 기능이 Python 2.7.7에 추가된 내용:

  • hmac.compare_digest`는 타이밍 공격에 방어적인 비교 작업을 Python 2 애플리케이션에서 사용할 있도록 Python 3에서 역추적되었습니다. (Alex Gaynor 기여; :issue:`21306().)

  • OpenSSL 1.0.1g이 python.org에 게시된 공식 Windows 설치 프로그램에서 업그레이드되었습니다. (Zachary Ware 기여; bpo-21462.)

PEP 466 관련 기능이 Python 2.7.8에 추가된 내용:

  • hashlib.pbkdf2_hmac`는 안전한 비밀번호 저장에 적합하도록 해싱 알고리즘을 Python 2 애플리케이션에서 폭넓게 사용할 있도록 Python 3에서 역추적되었습니다. (Alex Gaynor 기여; :issue:`21304().)

  • OpenSSL 1.0.1h가 python.org에 게시된 공식 Windows 설치 프로그램용으로 업그레이드되었습니다. (Zachary Ware 기여; bpo-21671 을 통한 CVE 2014-0224.)

PEP 466 관련 기능이 Python 2.7.9에 추가된 내용:

  • Python 3.4의 ssl 모듈 대부분이 역추적되었습니다. 이는 이제 ssl`이 Server Name Indication, TLS1.x 설정, 플랫폼 인증서 저장소 액세스, :class:`~ssl.SSLContext 클래스 및 기타 기능을 지원함을 의미합니다. (Alex Gaynor와 David Reid 기여; bpo-21308.)

    특정 세부 정보는 모듈 문서의 “추가된 버전: 2.7.9” 노트를 참조하십시오.

  • os.urandom() 은 호출할 때마다 /dev/urandom 을 다시 여는 대신 파일 디스크립터를 /dev/urandom 에 캐시하도록 변경되었습니다. (Alex Gaynor 기여; bpo-21305.)

  • hashlib.algorithms_guaranteed`와 :data:`hashlib.algorithms_available`는 Python 3에서 역추적되어, Python 2 애플리케이션이 사용 가능한 가장 강력한 해시 알고리즘을 선택하기 쉽게 만들었습니다. (Alex Gaynor 기여; :issue:`21307)

PEP 477: ensurepip (PEP 453)를 Python 2.7에 역추적하기

:pep:`477`은 :pep:`453`의 ensurepip 모듈과 이 모듈로 인해 활성화된 개선된 문서를 Python 2.7 유지보수 릴리스에 포함하는 것을 승인하며, 이는 Python 2.7.9 릴리스에서 처음 나타납니다.

기본적으로 pip 부트스트래핑

새로운 ensurepip 모듈 (PEP 453 에서 정의됨)은 pip 설치 프로그램을 Python 설치에 부트스트랩하는 표준 크로스 플랫폼 메커니즘을 제공합니다. Python 2.7.9에 포함된 pip 버전은 pip 1.5.6이며, 향후 2.7.x 유지보수 릴리스는 릴리스 후보를 작성할 시점에 사용 가능한 최신 버전의 pip 로 번들된 버전을 업데이트 할 것입니다.

기본적으로 모든 플랫폼에서 pip, pipXpipX.Y 명령을 설치하며 (여기서 X.Y는 파이썬 설치 버전을 나타냅니다), 또한 pip 패키지와 그 종속성도 함께 설치됩니다.

CPython POSIX 시스템에서의 소스 빌드 의 경우, make installmake altinstall 명령은 기본적으로 pip 을 부트스트랩하지 않습니다. 이 동작은 설정(configure) 옵션을 통해 제어할 수 있으며 Makefile 옵션으로 재정의할 수 있습니다.

Windows와 Mac OS X에서는 CPython 설치 프로그램이 이제 기본적으로 CPython 자체와 함께 pip 을 설치합니다 (사용자는 설치 과정 중 설치를 거부할 수 있습니다). Windows 사용자의 경우, 명령줄에서 pip 을 기본으로 사용할 수 있도록 자동 PATH 수정에 동의해야 하며 그렇지 않으면 Windows용 Python 런처를 통해 py -m pip 로 여전히 접근할 수 있습니다.

:pep:`<0477#disabling-ensurepip-by-downstream-distributors>`에서 논의된 바와 같이, 플랫폼 패키지 관리자는 해당 명령을 기본적으로 설치하지 않도록 선택할 수 있으며, 호출될 때 해당 플랫폼에 설치하는 방법에 대해 명확하고 간단한 지침(일반적으로 시스템 패키지 관리자를 사용)을 제공하는 한 문제가 없습니다.

문서 변경 사항

이 변경 사항의 일부로, 파이썬 모듈 설치하기파이썬 모듈 배포하기 섹션은 간결한 시작 가이드 및 FAQ 문서로 완전히 재설계되었습니다. 대부분의 패키징 문서는 이제 Python Packaging Authority에서 관리하는 `Python Packaging User Guide <https://packaging.python.org>`__와 개별 프로젝트의 문서로 이동했습니다.

하지만, 이 마이그레이션이 현재 아직 불완전하기 때문에 레거시 버전의 가이드가 setuptools로 C와 C++ 확장 빌드하기 및 :ref:`setuptools-index`로 여전히 사용 가능합니다.

더 보기

PEP 453: Python 설치에서 pip 명시적 부트스트랩 지침

Donald Stufft와 Nick Coghlan이 작성하고, Donald Stufft, Nick Coghlan, Martin von Löwis 및 Ned Deily가 구현했습니다.

PEP 476: 표준 라이브러리 http 클라이언트에 기본적으로 인증서 검증 기능을 활성화하는 방법

PEP 476httplib 및 이 모듈을 사용하는 urllib2xmlrpclib 같은 모듈을 업데이트하여, 서버가 플랫폼 신뢰 저장소에 의해 서명되고 호스트 이름이 요청하는 호스트 이름과 일치하는 인증서를 제시하는지 기본적으로 검증하도록 수정함으로써 많은 애플리케이션의 보안성을 크게 향상시켰습니다. 이 변경 사항은 Python 2.7.9 릴리스에서 이루어졌습니다.

기존 동작이 필요한 애플리케이션은 대체 컨텍스트를 전달할 수 있습니다:

import urllib2
import ssl

# 이 코드는 모든 검증을 비활성화합니다.
context = ssl._create_unverified_context()

# 이는 호스트에 대한 특정 인증서를 사용하는 것을 허용하며, 트러스트 스토어에 있어야 할 필요가 없습니다.
context = ssl.create_default_context(cafile="/path/to/file.crt")

urllib2.urlopen("https://invalid-cert", context=context)

PEP 493: Python 2.7용 HTTPS 검증 마이그레이션 도구

:pep:`493`은 클라이언트 HTTPS 연결을 설정할 때 서버 인증서를 역사적으로 관대한 방식으로 처리하는 애플리케이션 및 서비스를 포함하는 환경에 대한 점진적인 인프라 업그레이드 프로세스를 지원하기 위해 추가적인 마이그레이션 도구를 제공합니다. 이러한 추가 사항은 Python 2.7.12 릴리스에서 이루어졌습니다.

이러한 도구는 영향을 받는 애플리케이션과 서비스가 연결을 설정할 때 더 관대한 SSL 컨텍스트를 명시적으로 전달하도록 수정될 수 없는 경우에 사용하기 위한 것입니다.

전혀 수정할 수 없는 애플리케이션과 서비스의 경우, 새로운 PYTHONHTTPSVERIFY 환경 변수를 0 으로 설정하여 전체 Python 프로세스를 Python 2.7.8 이전의 기본 관대한 동작으로 되돌릴 수 있습니다.

연결 설정 코드를 수정할 수는 없지만, 애플리케이션 자체를 수정할 수 있는 경우, 새로운 ssl._https_verify_certificates() 함수를 사용하여 런타임에 기본 동작을 조정할 수 있습니다.

make regen-all 빌드 목표

크로스 컴파일을 단순화하고 CPython이 기존 버전의 Python이 이미 사용 가능할 필요 없이 안정적으로 컴파일될 수 있도록 보장하기 위해, autotools 기반 빌드 시스템은 더 이상 파일 수정 시간을 기반으로 생성된 파일을 암시적으로 재컴파일하려고 시도하지 않습니다. 이것은 완전히 자동적인 과정입니다.

대신, 원하는 경우 이러한 파일을 강제로 재생성하기 위해 새로운 make regen-all 명령이 추가되었습니다 (예를 들어 사전 생성된 버전을 기반으로 Python의 초기 버전이 이미 빌드된 후).

더 선택적인 재생성 대상도 정의되어 있습니다. 자세한 내용은 :source:`Makefile.pre.in`을 참조하십시오.

(Victor Stinner가 :issue:`23404`에서 기여했습니다.)

Added in version 2.7.14.

make touch 빌드 대상 제거

이전에 파일 수정 시간을 업데이트하여 생성된 파일을 암시적으로 재생성하도록 요청하는 데 사용되던 make touch 빌드 대상이 제거되었습니다.

새로운 make regen-all 대상으로 대체되었습니다.

(Victor Stinner가 :issue:`23404`에서 기여했습니다.)

버전 2.7.14에서 변경.

감사의 말

필자는 이 문서의 다양한 초안을 제안하고, 수정하고, 도움을 준 다음 분들께 감사드립니다: Nick Coghlan, Philip Jenvey, Ryan Lovett, R. David Murray, Hugh Secker-Walker.

분실물 보관소