Python 2.7의 새로운 기능¶
- 저자:
A.M. Kuchling (amk@amk.ca)
이 문서는 Python 2.7의 새로운 기능을 설명합니다. Python 2.7은 2010년 7월 3일에 출시되었습니다.
부동 소수점 수와 Decimal 클래스 모두에서 숫자 처리 방식이 여러 방면으로 개선되었습니다. 표준 라이브러리에는 크게 강화된 unittest 모듈, 명령 줄 옵션 파싱을 위한 argparse 모듈, collections 모듈의 편리한 OrderedDict 및 Counter 클래스 등 유용한 기능들이 추가되었으며 다양한 개선 사항이 포함되었습니다.
Python 2.7은 2.x 시리즈의 마지막 릴리스로 계획되었으므로, 장기적으로 유용한 버전이 되도록 제작되었습니다. Python 3로의 이식을 돕기 위해 Python 3.x 시리즈의 여러 신규 기능들이 2.7에 포함되었습니다.
이 문서는 새로운 기능에 대한 완전한 명세를 제공하는 대신 편리한 개요를 제공합니다. 자세한 내용은 https://docs.python.org의 Python 2.7 문서를 참조하십시오. 설계 및 구현의 근거를 이해하려면 특정 새 기능에 대한 PEP나 https://bugs.python.org에서 논의된 이슈를 참조하십시오. 가능한 경우, “What’s New in Python”은 각 변경 사항에 대한 버그/패치 항목으로 연결됩니다.
Python 2.x의 미래¶
Python 유지 관리자들이 새로운 기능 개발에 대한 중점을 Python 3.x 시리즈로 옮김에 따라, Python 2.7은 2.x 시리즈의 마지막 주요 릴리스입니다. 이는 Python 2가 버그 수정 및 새로운 하드웨어와 지원 운영 체제 버전에서 정상적으로 빌드되도록 업데이트되는 동안, 언어나 표준 라이브러리에 대한 새로운 기능이 추가로 포함되지는 않음을 의미합니다.
그러나 Python 2.7과 Python 3 사이에 큰 공통 부분 집합이 존재하며, 해당 부분 또는 직접적인 Python 3 이식과 관련된 많은 변경 사항을 안전하게 자동화할 수 있지만, 다른 일부 변경 사항(특히 Unicode 처리와 관련된 것)은 효과적으로 이전하기 위해 신중한 고려와 견고한 자동 회귀 테스트 스위트가 필요할 수 있습니다.
이는 Python 2.7이 오랜 기간 유지되어 아직 Python 3로 이식되지 않은 운영 시스템에 안정적이고 지원되는 기반 플랫폼을 제공할 것임을 의미합니다. Python 2.7 시리즈의 전체 예상 수명 주기는 PEP 373 에 상세히 기술되어 있습니다.
2.7이 갖는 장기적 중요성에 따른 주요 결과는 다음과 같습니다.
위에서 언급했듯이, 2.7 릴리스는 이전 2.x 버전들과 비교하여 훨씬 긴 유지 관리 기간을 가집니다. 현재 Python 2.7은 핵심 개발팀에 의해 최소 2020년까지(초기 출시 후 10년 동안, 일반적인 지원 기간인 18~24개월보다 훨씬 김) 보안 업데이트 및 기타 버그 수정을 포함한 지원이 계속될 것으로 예상됩니다.
파이썬 2.7 표준 라이브러리가 오래됨에 따라 Python Package Index (직접 또는 재배포기 사용을 통해)를 효과적으로 사용하는 것이 Python 2 사용자들에게 더욱 중요해졌습니다. 다양한 작업을 위한 방대한 제3자 패키지 외에도, 이용 가능한 패키지에는 Python 2와 호환되는 Python 3 표준 라이브러리의 새로운 모듈 및 기능에 대한 백포트(backports)뿐만 아니라, Python 3으로의 마이그레이션을 더 쉽게 할 수 있도록 해주는 다양한 도구와 라이브러리가 포함되어 있습니다. Python Packaging User Guide 는 Python Package Index에서 소프트웨어를 다운로드 및 설치하는 과정에 대한 안내를 제공합니다.
현재 Python 2를 강화하는 권장 방식은 Python Package Index에 새 패키지를 게시하는 것이지만, 이 방법이 모든 경우, 특히 네트워크 보안과 관련된 경우에는 작동하지 않을 수 있습니다. PyPI에 새 패키지 또는 업데이트된 패키지를 게시하여 적절히 처리할 수 없는 예외적인 경우에, 새로운 기능을 Python 2 표준 라이브러리에 직접 추가하기 위해 Python Enhancement Proposal 프로세스를 사용할 수 있습니다. 이러한 모든 추가 사항 및 해당 기능이 추가된 유지 관리 릴리스는 아래의 Python 2.7 유지 관리 릴리스에 추가된 새로운 기능 섹션에 기재됩니다.
Python 2에서 Python 3로 이전하려는 프로젝트나, Python 2 및 Python 3 사용자 모두를 지원하고자 하는 라이브러리 및 프레임워크 개발자를 위해 적절한 접근 방식을 결정하고 관련 기술적 세부 사항을 관리하는 데 도움이 되는 다양한 도구와 가이드가 제공됩니다. 권장되는 시작 지점은 파이썬 2 코드를 파이썬 3으로 이식하는 법 HOWTO 가이드입니다.
폐지 경고(Deprecation Warning) 처리 방식 변경¶
Python 2.7에서는 기본적으로 개발자에게만 유용한 경고를 무음 처리하기로 정책을 결정했습니다. 이제 요청이 없는 한 DeprecationWarning 및 그 파생 경고는 무시되며, 사용자가 애플리케이션에 의해 트리거되는 경고를 보는 것을 방지합니다. 이 변경 사항은 Python 3.2가 된 브랜치에서도 적용되었습니다. (stdlib-sig에서 논의되었으며 bpo-7319 에서 수행됨.)
이전 릴리스에서는 DeprecationWarning 메시지가 기본으로 활성화되어, Python 개발자가 향후 주요 버전의 Python에서 코드가 깨질 수 있는 지점을 명확하게 알 수 있도록 했습니다.
그러나 Python 기반 애플리케이션 사용자의 상당수는 해당 애플리케이션 개발에 직접 참여하지 않습니다. 이러한 사용자들에게 DeprecationWarning 메시지는 관련이 없으며, 오히려 정상적으로 작동하는 애플리케이션에 대해 걱정하게 만들고 애플리케이션 개발자가 불필요한 응답에 대응해야 하는 부담을 줍니다.
Python을 실행할 때 -Wdefault (단축형: -Wd) 스위치를 사용하거나, 실행 전에 PYTHONWARNINGS 환경 변수를 "default" (또는 "d")로 설정하여 DeprecationWarning 메시지 표시를 다시 활성화할 수 있습니다. 또한 Python 코드에서 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라이브러리의 새 버전.PEP 372: collections에 Ordered Dictionary 추가 에서 설명하는 순서가 있는(ordered) 딕셔너리 타입.
pep-0378`에서 설명하는 새로운 `”,”`` 형식 지정자.
memoryview객체.importlib모듈의 작은 하위 집합 (아래에 <#importlib-section> 설명).부동 소수점
x에 대한repr()이 많은 경우 더 짧아졌습니다. 이제는x로 다시 반올림되는 것이 보장되는 가장 짧은 10진 문자열을 기반으로 합니다. 이전 버전과 마찬가지로,float(repr(x))가x를 복원하는 것은 보장됩니다.부동 소수점과 문자열 간의 변환이 정확하게 반올림됩니다. 또한
round()함수도 이제 올바르게 반올림됩니다.확장 모듈을 위한 C API를 제공하는 데 사용되는
PyCapsule타입입니다.PyLong_AsLongAndOverflow()C API 함수입니다.
기타 새로운 Python3 모드 경고는 다음과 같습니다:
3.x 버전에서 지원되지 않는
operator.isCallable()및operator.sequenceIncludes()가 이제 경고를 발생시킵니다.-3스위치는 이제 정수 및 long 타입과의 고전적인 나눗셈 사용에 대해 경고를 발생시키는-Qwarn스위치를 자동으로 활성화합니다.
PEP 372: collections에 Ordered Dictionary 추가¶
일반적인 파이썬 딕셔너리는 키/값 쌍을 임의의 순서로 반복합니다. 수년에 걸쳐 여러 저자가 키가 처음 삽입된 순서를 기억하는 대체 구현체들을 작성해 왔습니다. 이러한 구현 사례를 바탕으로, 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
OrderedDict 를 일반 딕셔너리와 비교할 때는 삽입 순서를 무시하고 키와 값만 비교합니다.
OrderedDict 은 어떻게 작동할까요? 이 클래스는 키의 이중 연결 리스트를 유지하며, 새로운 키가 삽입될 때마다 해당 리스트에 추가합니다. 보조 딕셔너리가 키를 대응하는 리스트 노드에 매핑하므로 삭제 시 전체 연결 리스트를 탐색할 필요가 없어 시간 복잡도가 O (1)을 유지합니다.
표준 라이브러리는 이제 여러 모듈에서 순서 있는 딕셔너리 사용을 지원합니다.
ConfigParser모듈은 기본적으로 이를 사용하며, 이는 구성 파일이 원래 순서대로 읽히고 수정된 후 다시 기록될 수 있음을 의미합니다.collections.namedtuple()을 위한_asdict()메서드는 이제 기본 튜플 인덱스와 동일한 순서로 값이 나타나는 순서 있는 딕셔너리를 반환합니다.json모듈의JSONDecoder클래스 생성자에 object_pairs_hook 매개변수가 추가되어 디코더가OrderedDict인스턴스를 빌드할 수 있게 되었습니다. 또한 PyYAML <https://pyyaml.org/> 와 같은 서드파티 도구에 대한 지원도 추가되었습니다.
더 보기
- PEP 372 - collections에 순서 있는 딕셔너리 추가
Armin Ronacher와 Raymond Hettinger가 작성하고, Raymond Hettinger가 구현한 PEP입니다.
PEP 378: 천 단위 구분 기호용 포맷 지정자¶
프로그램 출력을 더 읽기 쉽게 만들려면 큰 숫자에 구분 기호를 추가하여 18446744073709551616 대신 18,446,744,073,709,551,616과 같이 표시하는 것이 유용할 수 있습니다.
이를 위한 완전한 해결책은 다양한 구분 기호(북미는 “,”, 유럽은 “.”)와 다양한 그룹화 크기를 사용할 수 있는 locale 모듈이지만, locale 은 사용법이 복잡하며 서로 다른 스레드가 서로 다른 지역에 맞는 출력을 생성하는 멀티스레드 애플리케이션에는 적합하지 않습니다.
따라서 str.format() 메서드에서 사용하는 미니 언어에 간단한 쉼표 그룹화 메커니즘이 추가되었습니다. 부동 소수점 숫자를 포맷팅할 때 폭(width)과 정밀도(precision) 사이에 쉼표를 포함하기만 하면 됩니다:
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
정수를 포맷팅할 때는 폭 뒤에 쉼표를 포함하십시오:
>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'
이 메커니즘은 유연성이 전혀 없으며 쉼표가 항상 구분 기호로 사용되고 그룹화는 항상 세 자리 단위로 이루어집니다. 이 쉼표 포맷팅 방식은 locale 모듈만큼 범용적이지는 않지만, 훨씬 사용하기 쉽습니다.
더 보기
- PEP 378 - 천 단위 구분 기호용 포맷 지정자
Raymond Hettinger가 작성하고 Eric Smith가 구현한 PEP입니다.
PEP 389: 명령줄 분석을 위한 argparse 모듈¶
argparse 모듈이 명령줄 인자를 파싱하는 더 강력한 대안으로 optparse 모듈을 대체하며 추가되었습니다.
이는 파이썬이 이제 명령줄 인자를 파싱하기 위해 세 가지 서로 다른 모듈인 getopt, optparse, 그리고 argparse 를 지원함을 의미합니다. getopt 모듈은 C 라이브러리의 getopt() 함수와 매우 유사하므로, 나중에 C로 재작성될 파이썬 프로토타입을 작성하는 경우 여전히 유용합니다. optparse 는 중복되지만, 여전히 이를 사용하는 스크립트가 많고 이를 자동으로 업데이트할 방법이 없기 때문에 삭제 계획은 없습니다. (argparse API를 optparse 의 인터페이스와 일치하게 만드는 방안도 논의되었으나 너무 복잡하고 어렵다는 이유로 거부되었습니다.)
요약하자면, 새로운 스크립트를 작성하고 이전 버전의 파이썬과의 호환성을 걱정할 필요가 없다면 optparse 대신 argparse 를 사용하십시오.
다음은 예시입니다:
import argparse
parser = argparse.ArgumentParser(description='Command-line example.')
# 선택적 스위치 추가
parser.add_argument('-v', action='store_true', dest='is_verbose',
help='produce verbose output')
parser.add_argument('-o', action='store', dest='output',
metavar='FILE',
help='direct output to FILE instead of stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
metavar='NUM', default=0,
help='display NUM lines of added context')
# 원하는 만큼의 추가 인자를 허용합니다.
parser.add_argument(nargs='*', action='store', dest='inputs',
help='input filenames (default is 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
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 는 optparse 보다 훨씬 정교한 검증을 제공합니다. 인자의 개수를 정수로 명시하거나, '*' 를 전달하여 0개 이상의 인자, '+' 를 사용하여 1개 이상의 인자, 또는 '?'''를 사용하여 선택적 인자를 지정할 수 있습니다. 최상위 파서는 `` svn commit, `` svn checkout`` 등과 같이 서로 다른 스위치 세트를 가진 서브 명령을 정의하기 위해 서브 파서를 포함할 수 있습니다. 또한 인자의 타입을 FileType 으로 지정하면 파일이 자동으로 열리고, '-' 가 표준 입력 또는 출력을 의미하는 것을 인식합니다.
더 보기
argparse문서argparse 모듈의 도움말 페이지입니다.
- optparse 코드를 argparse 로 마이그레이션
optparse를 사용하는 코드를 변환하는 방법을 설명하는 파이썬 문서의 일부입니다.- PEP 389 - argparse - 새로운 명령줄 파싱 모듈
Steven Bethard가 작성하고 구현한 PEP입니다.
PEP 391: 로깅을 위한 딕셔너리 기반 구성¶
logging 모듈은 매우 유연합니다. 애플리케이션은 로깅 하위 시스템의 트리 구조를 정의할 수 있으며, 이 트리에 있는 각 로거는 특정 메시지를 걸러내고, 다르게 포맷팅하며, 다양한 수의 핸들러로 메시지를 전달할 수 있습니다.
이 모든 유연성을 구현하려면 많은 설정이 필요할 수 있습니다. 파이썬 문을 작성하여 객체를 생성하고 속성을 설정할 수 있지만, 복잡한 구성은 장황하지만 지루한 코드를 요구합니다. logging 은 파일을 파싱하는 fileConfig() 함수도 지원하지만, 이 파일 형식은 필터 구성을 지원하지 않으며 프로그램 방식으로 생성하기가 더 까다롭습니다.
Python 2.7은 딕셔너리를 사용하여 로깅을 구성하는 dictConfig() 함수를 추가했습니다. 다양한 소스에서 딕셔너리를 생성하는 방법에는 여러 가지가 있습니다: 코드로 구축하거나, JSON이 포함된 파일을 파싱하거나, 설치되어 있는 경우 YAML 파싱 라이브러리를 사용하는 방식 등입니다. 자세한 내용은 구성 함수 를 참조하십시오.
다음 예제는 루트 로거와 “network”라는 이름의 로거 두 개를 설정합니다. 루트 로거로 전송된 메시지는 syslog 프로토콜을 사용하여 시스템 로그로 전송되며, “network” 로거로 전송된 메시지는 로그가 1MB에 도달할 때마다 로테이트되는 network.log 파일에 기록됩니다.
import logging
import logging.config
configdict = {
'version': 1, # 현재 사용 중인 구성 스키마; 당분간은 1이어야 함
'formatters': {
'standard': {
'format': ('%(asctime)s %(name)-15s '
'%(levelname)-8s %(message)s')}},
'handlers': {'netlog': {'backupCount': 10,
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/logs/network.log',
'formatter': 'standard',
'level': 'INFO',
'maxBytes': 1000000},
'syslog': {'class': 'logging.handlers.SysLogHandler',
'formatter': 'standard',
'level': 'ERROR'}},
# 모든 하위 로거 지정
'loggers': {
'network': {
'handlers': ['netlog']
}
},
# 루트 로거의 속성 지정
'root': {
'handlers': ['syslog']
},
}
# 구성 설정
logging.config.dictConfig(configdict)
# 예시로 두 개의 에러 메시지 기록
logger = logging.getLogger('/')
logger.error('Database not found')
netlogger = logging.getLogger('network')
netlogger.error('Connection failed')
Vinay Sajip이 구현한 logging 모듈에 대한 세 가지 작은 개선 사항은 다음과 같습니다.
SysLogHandler클래스가 이제 TCP를 통한 syslogging을 지원합니다. 생성자에는 사용할 소켓의 유형을 지정하는 socktype 파라미터가 있으며, UDP용socket.SOCK_DGRAM또는 TCP용socket.SOCK_STREAM중 하나를 선택할 수 있습니다. 기본 프로토콜은 여전히 UDP입니다.Logger인스턴스에 상대 경로를 사용하여 하위 로거를 가져오는getChild()메서드가 추가되었습니다. 예를 들어,log = getLogger('app')을 통해 로거를 가져온 후log.getChild('network.listen')을 호출하는 것은getLogger('app.network.listen')을 호출하는 것과 동일합니다.LoggerAdapter클래스에 level 을 인자로 받아 해당 중요 수준의 메시지를 하부 로거가 처리할지 여부를 반환하는isEnabledFor()메서드가 추가되었습니다.
더 보기
- PEP 391 - 로깅을 위한 딕셔너리 기반 구성
Vinay Sajip이 작성하고 구현한 PEP.
PEP 3106: 딕셔너리 뷰¶
Python 3.x에서 딕셔너리 메서드인 keys(), values(), 그리고 items() 는 이전과 다르게 동작합니다. 이 메서드들은 완전히 생성된 리스트 대신 view 라고 불리는 객체를 반환합니다.
Python 2.7에서는 너무 많은 코드가 깨질 수 있기 때문에 keys(), values(), 및 items() 의 반환 값을 변경할 수 없습니다. 대신 3.x 버전의 기능이 viewkeys(), viewvalues(), 및 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])
뷰를 반복(iterate)할 수 있으며, 키 및 아이템 뷰는 집합과 같이 동작합니다. & 연산자는 교집합을 수행하고, | 연산자는 합집합을 수행합니다:
>>> 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 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 객체는 하부 객체가 가변(mutable)인 경우 해당 객체를 수정할 수 있게 해줍니다.
>>> m2[0] = 75
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> b = bytearray(string.letters) # 가변 객체 생성
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*' # 뷰에 할당하여 bytearray 변경.
>>> b[0:5] # bytearray가 변경됨.
bytearray(b'*bcde')
>>>
이외의 언어 변경 사항¶
핵심 파이썬 언어에 가해진 일부 작은 변경 사항은 다음과 같습니다:
세트 리터럴 문법이 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()함수가 매우 유사한 기능을 제공하므로 더 이상 필요하지 않으며 폐지되었습니다.(https://codereview.appspot.com/53094에서 제안되었으며, Georg Brandl이 구현했습니다.)
부동 소수점 수와 문자열 간의 변환이 이제 대부분의 플랫폼에서 올바르게 반올림됩니다. 이러한 변환은 여러 위치에서 발생합니다: 부동 소수점 및 복소수에 대한
str();float및complex생성자; 숫자 포맷팅;marshal,pickle,json모듈을 사용한 부동 소수점 및 복소수의 직렬화 및 역직렬화; Python 코드 내의 부동 소수점 및 허수 리터럴 파싱; 그리고Decimal에서 float으로의 변환.이와 관련하여, 부동 소수점 수 x 의
repr()은 이제 올바른 반올림(짝수 쪽으로 내림 모드)을 적용했을 때 다시 x 로 변환됨이 보장되는 가장 짧은 십진수 문자열을 기반으로 결과를 반환합니다. 이전에는 x를 소수점 아래 17자리까지 반올림한 것을 바탕으로 한 문자열을 제공했습니다.이 개선을 담당하는 반올림 라이브러리는 Windows 및 gcc, icc 또는 suncc 컴파일러를 사용하는 Unix 플랫폼에서 작동합니다. 이 코드가 올바르게 작동할 수 있다고 보장되지 않는 소수의 플랫폼이 있을 수 있으므로 해당 시스템에서는 코드를 사용하지 않습니다. 현재 어떤 코드가 사용되는지는
sys.float_repr_style을 확인하여 알 수 있으며, 새 코드가 사용 중이면short, 그렇지 않으면legacy로 표시됩니다.Eric Smith와 Mark Dickinson이 구현했으며, David Gay의
dtoa.c라이브러리를 사용합니다; bpo-7117long 정수 및 일반 정수를 부동 소수점으로 변환할 때 이제 다르게 반올림되어 원래 수와 가장 가까운 부동 소수점 수를 반환합니다. 정확하게 변환될 수 있는 작은 정수의 경우에는 문제가 되지 않지만, 불가피하게 정밀도가 손실되는 큰 수의 경우 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-1588 및 bpo-7988.)‘F’ 형식 코드가 이제 항상 대문자를 사용하여 출력을 포맷으로 생성하므로, 이제 ‘INF’ 및 ‘NAN’을 생성합니다. (Eric Smith가 기여했습니다; bpo-3382.)
저수준의 변경 사항입니다:
object.__format__()메서드에 포맷 문자열이 전달되면 이제PendingDeprecationWarning이 발생합니다. 이는object를 위한__format__()메서드가 객체를 문자열로 변환한 후 해당 문자를 포맷팅하기 때문입니다. 이전에는 이 메서드가 문자열 표현에 포맷 문자열을 조용히 적용했지만, 이는 파이썬 코드의 실수를 숨길 수 있었습니다. 정렬이나 정밀도와 같은 포맷팅 정보를 제공할 때, 아마도 사용자는 객체 고유의 방식으로 포맷팅이 적용되기를 기대할 것입니다. (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및@staticmethod를 사용할 때, 이제 래퍼 객체가 래핑된 함수를 해당__func__어트리뷰트로 노출합니다. (George Sakkis의 제안에 따라 Amaury Forgeot d’Arc가 기여함; bpo-5982.)__slots__를 사용하여 제한된 어트리뷰드 세트를 설정했을 때, 설정되지 않은 어트리뷰를 삭제하면 예상과 달리AttributeError가 발생하지 않는 문제가 수정되었습니다. (Benjamin Peterson에 의해 수정됨; bpo-7604.)이제 두 가지 새로운 인코딩이 지원됩니다. 주로 아랍어 텍스트에 사용되는 “cp720”과 유로 기호가 추가된 CP 850의 변형인 “cp858”입니다. (CP720은 Alexander Belchenko와 Amaury Forgeot d’Arc가 bpo-1616979 에서 기여했으며, CP858은 Tim Hatch가 bpo-8016 에서 기여했습니다.)
POSIX 플랫폼에서 디렉터리를 열려고 시도할 때
file객체가IOError예외에서filename어트리뷰스를 설정하며(Jan Kaliszewski가 언급; bpo-4764), 이제 C 라이브러리가 오류를 감지하고 보고하도록 신뢰하는 대신 읽기 전용 파일 객체에 대한 쓰기를 명시적으로 확인하고 금지합니다(Stefan Krah에 의해 수정됨; bpo-5677).Python 토크나이저는 이제 줄바꿈을 자체적으로 변환하므로,
compile()내장 함수는 이제 모든 종류의 줄바꿈 방식을 사용하는 코드를 수용합니다. 또한 더 이상 코드가 새 줄임표로 끝나야 할 필요가 없습니다.함수 정의에서 추가적인 괄호는 Python 3.x에서 허용되지 않으며, 이는
def f((x)): pass와 같은 경우 구문 오류(syntax error)를 발생시킵니다. Python 3-warning 모드에서 Python 2.7은 이제 이러한 이상한 사용법에 대해 경고를 표시합니다. (James Lingard가 언급; bpo-7362.)이제 구형 클래스 객체에 대한 약한 참조를 생성하는 것이 가능합니다. 신규 스타일 클래스는 항상 약한 참조가 가능했습니다 (Antoine Pitrou가 수정했으며, bpo-8268.).
모듈 객체가 가비지 컬렉션될 때, 다른 누구도 해당 딕셔너리에 대한 참조를 보유하고 있지 않은 경우에만 모듈의 딕셔너리가 삭제됩니다 (bpo-7140).
인터프리터 변경 사항¶
새로운 환경 변수 PYTHONWARNINGS 를 통해 경고를 제어할 수 있습니다. 이 변수는 ;로 구분된, -W 옵션과 동일한 설정이 포함된 문자열로 설정해야 합니다. (Brian Curtin이 기여함; bpo-7301.)
예를 들어, 다음 설정을 통해 경고가 발생할 때마다 출력하도록 하되, Cookie 모듈의 경고를 에러로 전환할 수 있습니다. (환경 변수 설정을 위한 정확한 구문은 운영 체제와 셸에 따라 다릅니다.)
export PYTHONWARNINGS=all,error:::Cookie:0
최적화들`¶
몇 가지 성능 개선 사항이 추가되었습니다:
with문을 위한 초기 설정을 수행하기 위해__enter__()및__exit__()메서드를 찾는 새로운 opcode가 추가되었습니다. (Benjamin Peterson이 기여함.)가비지 컬렉터(garbage collector)는 흔히 사용되는 패턴 중 하나인 많은 객체가 해제되지 않고 할당될 때 성능이 향상됩니다. 이전에는 가비지 수거에 이차 시간(quadratic time)이 소요되었으나, 이제 힙의 객체 수가 증가함에 따라 전체 가비지 수거 횟수가 줄어듭니다. 새로운 로직은 중간 세대(middle generation)가 10번 수거되고 중급 세대의 생존자(survivor) 객체가 가장 오래된 세대(oldest generation)의 객체 수보다 많을 경우에만 전체 가비지 수거 패스를 수행합니다. (Martin von Löwis가 제안하고 Antoine Pitrou가 구현함; bpo-4074.)
가비지 컬렉터는 순환(cycle)의 일부가 될 수 없는 단순 컨테이너를 추적하는 것을 피하려고 시도합니다. Python 2.7에서 이는 원자 타입(int, string 등 포함)을 포함하는 튜플과 딕셔너리에 적용됩니다. 연쇄적으로, 원자 유형의 튜플을 포함하는 딕셔너리도 추적되지 않습니다. 이는 고려되고 탐색되어야 할 객체의 수를 줄여 매 가비지 수거의 비용을 절감하는 데 도움이 됩니다. (Antoine Pitrou가 기여함; bpo-4688.)
긴 정수(long integers)는 이제 빌드 시점에 결정된 기준에 따라 2**15 또는 2** 30을 기반으로 내부적으로 저장됩니다. 이전에는 항상 2**15를 사용했습니다. 2** 30을 사용하면 64비트 머신에서 상당한 성능 향상을 제공하지만, 32비트 머신에서의 벤치마크 결과는 엇갈렸습니다. 따라서 기본값은 64비트 머신에서는 2**30를, 32비트 머신에서는 2** 15를 사용하는 것입니다. Unix의 경우, 이 기본값을 재정의할 수 있는 새로운 구성 옵션
--enable-big-digits가 제공됩니다.이 변경 사항은 성능 개선 외에는 일반 사용자에게 보이지 않으나 한 가지 예외가 있습니다. 테스트 및 디버깅 목적을 위해 내부 형식을 알려주고, 각 자리당 비트 수와 각 자리를 저장하는 데 사용되는 C 타입의 바이트 크기를 제공하는 새로운 structseq
sys.long_info가 추가되었습니다.>>> import sys >>> sys.long_info sys.long_info(bits_per_digit=30, sizeof_digit=4)
(Mark Dickinson이 기여했습니다; bpo-4258.)
또 다른 변경 사항으로 긴 객체(long objects)의 크기가 몇 바이트 줄어들었습니다. 32비트 시스템에서는 2바이트, 64비트 시스템에서는 6바이트가 감소했습니다. (Mark Dickinson이 기여함; bpo-5260.)
내부 루프를 강화하고, 곱셈 대신 비트를 이동(shift)하며, 불필요한 추가 반복을 수정하여 긴 정수용 나눗셈 알고리즘의 속도가 향상되었습니다. 다양한 벤치마크 결과에 따르면 긴 정수 나눗셈 및 나머지 연산이 50%에서 150%까지 빨라진 것으로 나타났습니다. (Mark Dickinson이 기여함; bpo-5512.) 비트 연산 또한 상당히 빨라졌습니다(초기 패치: Gregory Smith, bpo-1087418).
%구현 시 왼쪽 피연산자가 Python 문자열인 경우를 확인하고 별도로 처리합니다. 이는 템플릿 라이브러리와 같이 문자열과 함께%를 자주 사용하는 애플리케이션에서 1~3%의 성능 향상을 가져옵니다. (Collin Winter가 구현함; bpo-5176.)조건문이 포함된 리스트 컴프리헨션이 더 빠른 바이트코드로 컴파일됩니다. (Antoine Pitrou의 패치이며, Jeffrey Yasskin에 의해 2.7로 백포트됨; bpo-4715.)
정수 또는 긴 정수를 소수점 문자열로 변환할 때, 임의의 기반을 지원하는 일반적인 변환 함수를 사용하는 대신 10진법인 경우를 별도로 처리하여 속도를 높였습니다. (Gawain Bolton이 패치함; bpo-6713.)
문자열과 유사한 타입(문자열, Unicode 문자열 및
bytearray객체)의split(),replace(),rindex(),rpartition(), 및rsplit()메서드가 이제 글자 하나하나를 스캔하는 대신 빠른 역방향 검색 알고리즘을 사용합니다. 이는 때때로 10배 더 빠릅니다. (Florent Xicluna가 추가함; bpo-7462 및 bpo-7622.)pickle및cPickle모듈이 이제 속성 이름에 사용되는 문자열을 자동으로 인턴(intern)하여 언피클링 결과로 생성된 객체의 메모리 사용량을 줄입니다. (Jake McGuire가 기여함; bpo-5084.)cPickle모듈이 이제 딕셔너리를 별도로 처리하여 피클링에 필요한 시간을 거의 절반으로 줄입니다. (Collin Winter가 기여함; bpo-5670.)
개선 및 신규 모듈¶
모든 릴리스와 마찬가지로, Python 표준 라이브러리에는 여러 개선 사항과 버그 수정이 포함되었습니다. 다음은 모듈 이름 알파벳 순으로 정렬된 주요 변경 사항의 일부입니다. 소스 트리의 Misc/NEWS 파일을 참조하여 더 완전한 목록을 확인하거나 Subversion 로그를 통해 상세 내용을 확인할 수 있습니다.
bdb모듈의 기본 디버깅 클래스인(Senthil Kumaran의 제안에 따라 Maru Newby가 기여함; :issue:`5142.)binascii모듈은 이제 버퍼 API를 지원하므로memoryview인스턴스와 다른 유사한 버퍼 객체와 함께 사용될 수 있습니다. (플로렌 피클루나가 3.x 버전에서 백포팅; bpo-7703.)업데이트된 모듈:
bsddb모듈이 4.7.2devel9에서 the pybsddb package <https://www.jcea.es/programacion/pybsddb.htm>`__의 버전 4.8.4로 업데이트되었습니다. 새 버전은 향상된 Python 3.x 호환성, 다양한 버그 수정, 그리고 몇 가지 새로운 BerkeleyDB 플래그 및 메서드를 추가합니다. (Jesús Cea Avión에 의해 업데이트됨; :issue:`8156. pybsddb 변경 로그는 https://hg.jcea.es/pybsddb/file/tip/ChangeLog에서 확인할 수 있습니다.)bz2모듈의(Hagen Fürstenau가 기여함; :issue:`3860.)새로운 클래스:
collections모듈의Counter클래스는 데이터를 집계하는 데 유용합니다.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메서드가 있습니다.most_common()은 가장 빈도가 높은 N개의 요소와 그 수를 반환합니다.elements()는 포함된 요소들에 대한 이터레이터를 반환하며, 각 요소를 해당 횟수만큼 반복합니다.subtract()는 반복 가능한 객체를 받아 각 요소에 대해 더하는 대신 하나씩 빼고, 인수가 딕셔너리나 다른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'] # Count is now lower -1
Raymond Hettinger가 기여함; bpo-1696199.
새로운 클래스:
OrderedDict는 앞선 섹션인 PEP 372: collections에 Ordered Dictionary 추가 에서 설명합니다.새로운 메서드:
deque데이터 타입에 이제 입력된 인자 x 와 일치하는 요소의 수를 반환하는count()메서드와, 데크의 요소를 제자리에서 뒤집는reverse()메서드가 추가되었습니다. 또한deque는 최대 길이를 읽기 전용인maxlen속성으로 노출합니다. (두 기능 모두 Raymond Hettinger에 의해 추가됨.)namedtuple클래스에 선택적인 rename 매개변수가 추가되었습니다. rename 이 True인 경우, 중복되거나 유효한 Python 식별자가 아니어서 잘못된 필드 이름들이 리스트 내의 위치에서 파생된 적법한 이름으로 변경됩니다.>>> 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이 아닌 다른 타입과 비교될 때NotImplemented를 반환합니다. (Daniel Stutzbach에 의해 수정됨; bpo-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을 항상 CNULL포인터로 변환합니다. (Thomas Heller가 bpo-4606 에서 수정함.) 기반이 되는 libffi 라이브러리 <https://sourceware.org/libffi/>`__가 여러 플랫폼에 대한 다양한 수정 사항을 포함하는 3.0.9 버전으로 업데이트되었습니다. (Matthias Klose가 :issue:`8142 에서 업데이트함.)새 메서드:
datetime모듈의timedelta클래스에 지속 시간 내의 초수를 반환하는total_seconds()메서드가 추가되었습니다. (Brian Quinlan이 bpo-5788 에서 제공함.)새 메서드:
Decimal클래스에 부동 소수점 수를Decimal로 정확하게 변환하는from_float()클래스 메서드가 추가되었습니다. 이 정확한 변환은 부동 소수점 표현 값과 가장 가까운 10진 근사치를 목표로 하므로, 결과로 나오는 10진 값에는 여전히 (있는 경우) 부정확함이 포함될 수 있습니다. 예를 들어,Decimal.from_float(0.1)은Decimal('0.1000000000000000055511151231257827021181583404541015625를 반환합니다. (Raymond Hettinger가 bpo-4796 에서 구현함.)Decimal인스턴스를 부동 소수점 수와 비교하면 이제 피연산자의 숫자 값을 기반으로 합리적인 결과가 생성됩니다. 이전에는 이러한 비교 시 객체를 비교하는 파이썬의 기본 규칙을 따랐기 때문에 유형에 따라 임의의 결과가 생성되었습니다. 단, float와Decimal사이의 변환 방식을 명시적으로 선택해야 하므로 덧셈과 같은 다른 연산에서Decimal`과 부동 소수점을 결합할 수는 없다는 점에 유의하십시오. (Mark Dickinson이 수정; :issue:`2531.)Decimal생성자는 이제 부동 소수점 수(Raymond Hettinger가 추가; bpo-8257)와 아랍-인도 숫자와 같은 비유럽 유니코드 문자(Mark Dickinson이 기여; bpo-6595)를 허용합니다.Context클래스의 대부분의 메서드는 이제Decimal인스턴스뿐만 아니라 정수도 허용하며, 유일한 예외는canonical()및is_canonical()메서드입니다. (Juan José Conti가 패치; bpo-7633.)When using
Decimalinstances with a string’sformat()method, the default alignment was previously left-alignment. This has been changed to right-alignment, which is more sensible for numeric types. (Changed by Mark Dickinson; bpo-6857.)신호 전달 NaN 값(또는
sNAN)을 포함하는 비교는 이제 비교 연산자에 따라 true 또는 false를 조용히 반환하는 대신조용한 NaN 값(또는 ``NaN`)은 이제 해시 가능합니다. (Mark Dickinson이 수정; bpo-7279.)difflib모듈은 파일 이름을 제공하는 헤더에서 공백 대신 탭 문자를 구분 기호로 사용하는 작은 변화를 통해 최신 diff/patch 도구와 더 호환되는 출력을 생성합니다. (Anatoly Techtonik이 수정; bpo-7585.)Distutils
sdist명령은 이제 항상MANIFEST파일을 재생성합니다. 이는MANIFEST.in또는setup.py파일이 수정되지 않았더라도 사용자가 포함해야 하는 새로운 파일을 생성했을 수 있기 때문입니다. (Tarek Ziadé가 수정; bpo-8688.)doctest모듈의IGNORE_EXCEPTION_DETAIL플래그는 이제 테스트되는 예외가 포함된 모듈의 이름을 무시합니다. (Lennart Regebro가 패치; bpo-7490.)email모듈의Message클래스는 이제 유니코드 값을 가진 페이로드를 허용하며, 페이로드를output_charset`에 지정된 인코딩으로 자동 변환합니다. (R. David Murray가 추가; :issue:`1368247.)Fraction클래스는 이제 생성자의 인자로 단일 float 또는Decimal인스턴스, 또는 두 개의 유리수(rational numbers)를 허용합니다. (Mark Dickinson이 구현; 유리수는 bpo-5812 에서 추가되었고, float/decimal은 bpo-8294 에서 추가되었습니다.)분수와 복소수 간의 순서 비교(
<,<=,>,>=)는 이제TypeError를 발생시킵니다. 이는 Oversight를 수정하여Fraction이 다른 수치 유형과 일치하도록 만듭니다.새로운 클래스:
ftplib모듈의(Giampaolo Rodola가 기여; :issue:`2054.)바이너리 업로드를 위한
storbinary()메서드는 추가된 rest 파라미터 덕분에 이제 업로드를 재개할 수 있습니다 (Pablo Mouzo가 패치; bpo-6845.)새로운 클래스 데코레이터:
functools모듈의@~functools.total_ordering은__eq__()메서드와__lt__(),__le__(),__gt__(), 또는__ge__()중 하나를 정의하는 클래스를 받아 누락된 비교 메서드를 생성합니다. Python 3.x에서__cmp__()메서드가 폐기됨에 따라, 이 데코레이터는 순서가 있는 클래스를 정의하기 쉽게 만들어줍니다. (Raymond Hettinger가 추가; bpo-5479.)새로운 함수:
cmp_to_key()는 두 개의 인자를 기대하는 구식 비교 함수를 받아sorted(),min(),max()등과 같은 함수의 key 파라미터로 사용할 수 있는 새로운 호출 가능(callable) 객체를 반환합니다. 주요 목적은 코드를 Python 3.x와 호환되도록 만드는 데 도움을 주는 것입니다. (Raymond Hetinger가 추가.)새로운 함수:
gc모듈의(Antoine Pitrou가 기여; :issue:`4688().)gzip모듈의) as f:``와 같이 작성할 수 있으며(Hagen Fürstenau 기여; :issue:`3860), 이제io.BufferedIOBaseABC를 구현하므로 더 빠른 처리를 위해io.BufferedReader`로 래핑할 수 있습니다(Nir Aides 기여; :issue:`7471). 또한 생성자에 선택적 타임스탬프를 제공하여 압축된 파일에 기록되는 수정 시간을 재정의하는 것도 가능합니다 (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.)HTTPConnection및HTTPSConnection클래스는 이제 연결에 사용될 소스 주소를 나타내는(host, port)2-튜플인 source_address 파라미터를 지원합니다. (Eldon Ziegler가 기여; bpo-3972.)ihooks모듈이 이제 상대 임포트를 지원합니다. 주의할 점은ihooks`는 임포트를 사용자 정의하는 오래된 모듈로, Python 2.0에서 추가된 :mod:!imputil` 모듈에 의해 대체되었습니다. (Neil Schemenauer가 상대 임포트 지원을 추가했습니다.)새로운 함수:
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 인수가 추가되었습니다.count()또한 키워드 인수를 허용하며, 부동 소수점이나Decimal인스턴스와 같은 비정수 값을 사용할 수 있습니다. (Raymond Hetikker가 구현; bpo-5032.)itertools.combinations()및itertools.product()는 이전에 입력 이터러블보다 큰 r 값에 대해ValueError를 발생시켰습니다. 이것이 사양 오류로 판단되어 이제 빈 이터레이터를 반환합니다. (Raymond Hetikker가 수정; bpo-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(),exp()를 사용하여 1을 빼는 것보다 더 정밀하게e**x - 1을 계산하는expm1(), 감마 함수를 위한gamma(), 그리고 감마 함수의 자연로그를 위한lgamma()가 추가되었습니다. (Mark Dickinson 및 nirinA raseliarison 기여; bpo-3366.)multiprocessing모듈의Manager*클래스에 이제 서브프로세스가 시작될 때마다 호출되는 콜러블(callable)과 해당 콜러블에 전달될 인자 세트를 전달할 수 있습니다. (lekma 기여; bpo-5585.)작업자 프로세스 풀을 제어하는
Pool클래스에 선택적 인수인 maxtasksperchild 가 추가되었습니다. 작업자 프로세스는 지정된 수의 작업을 수행한 후 종료되며, 이로 인해Pool은 새로운 작업자를 시작합니다. 이는 작업이 메모리나 기타 리소스를 누수시키거나 특정 작업으로 인해 작업자의 크기가 매우 커지는 경우에 유용합니다. (Charles Caz8on 기여; bpo-6963.)nntplib모듈이 이제 IPv6 주소를 지원합니다. (Derek Morr 기여; bpo-1664.)새 기능:
os모듈이 다음과 같은 POSIX 시스템 호출을 래핑합니다: 실제, 유효 및 저장된 GID와 UID를 반환하는getresgid()및getresuid(); 이를 새로운 값으로 설정하는setresgid()및setresuid(); 현재 프로세스의 그룹 액세스 목록을 초기화하는initgroups(). (GID/UID 기능은 Travis H.가 기여; bpo-6508. initgroups 지원은 Jean-Paul Calderone이 추가; bpo-7333.)os.fork()함수가 이제 자식 프로세스에서 임포트 락을 재초기화합니다. 이는 스레드에서(Zsolt Cserna 수정; :issue:`7242().)In the
os.pathmodule, thenormpath()andabspath()functions now preserve Unicode; if their input path is a Unicode string, the return value is also a Unicode string. (normpath()fixed by Matt Giuca in bpo-5827;abspath()fixed by Ezio Melotti in bpo-3426.)pydoc모듈이 이제 파이썬이 사용하는 다양한 심볼에 대한 도움말을 제공합니다. 예를 들어 이제help('<<')또는help('@')와 같은 명령을 수행할 수 있습니다. (David Laban 기여; bpo-4739.)re모듈의split(),sub(), 및subn()이 이제 모듈 내 다른 함수들과의 일관성을 위해 선택적 인수인 flags 를 수용합니다. (Gregory P. Smith 추가.)New function:
run_path()in therunpymodule will execute the code at a provided path argument. path can be the path of a Python source file (example.py), a compiled bytecode file (example.pyc), a directory (./package/), or a zip archive (example.zip). If a directory or zip path is provided, it will be added to the front ofsys.pathand the module__main__will be imported. It’s expected that the directory or zip contains a__main__.py; if it doesn’t, some other__main__.pymight be imported from a location later insys.path. This makes more of the machinery ofrunpyavailable to scripts that want to mimic the way Python’s command line processes an explicit path name. (Added by Nick Coghlan; bpo-6816.)새 기능:
shutil모듈의make_archive()는 파일 이름, 아카이브 유형(zip 또는 tar 포맷), 그리고 디렉터리 경로를 받아 해당 디렉터리의 내용을 포함하는 아카이브를 생성합니다. (Tarek Ziadé 추가.)shutil의copyfile()및copytree()함수는 이제 파이프를 복사하려고 할 때SpecialFileError예외를 발생시킵니다. 이전에는 코드가 파이프를 읽기용으로 열어 일반 파일처럼 취급하여 무한정 대기하는 문제가 있었습니다. (Antoine Pitrou 수정; bpo-3002.)signal모듈은 이제 정말로 필요한 경우가 아니면 시그널 처리기를 다시 설치하지 않으며, 이는 EINTR 시그널을 견고하게 잡는 것을 불가능하게 만들 수 있는 버그를 수정합니다. (Charles-Francois Natali 수정; bpo-8354.)새 기능:
site모듈에 사이트 및 사용자 특정 경로를 반환하는 세 가지 새로운 함수가 추가되었습니다.getsitepackages()는 모든 전역 site-packages 디렉터리 목록을 반환하고,getusersitepackages()는 사용자의 site-packages 디렉터리 경로를 반환하며,getuserbase()는 데이터를 저장하는 데 사용할 수 있는 디렉터리 경로인USER_BASE환경 변수 값을 반환합니다. (Tarek Ziadé 기여; bpo-6693.)site모듈은 이제sitecustomize모듈이 임포트될 때 발생하는 예외를 보고하며, 더 이상KeyboardInterrupt예외를 잡아 무시하지 않습니다. (Victor Stinner 수정; bpo-3137.)create_connection()함수에 연결 시 사용될 소스 주소를 나타내는(host, port)2-튜플인 source_address 매개변수가 추가되었습니다. (Eldon Ziegler 기여; bpo-3972.)recv_into()및recvfrom_into()메서드는 이제 buffer API를 지원하는 객체, 특히bytearray및memoryview객체에 데이터를 쓰도록 변경되었습니다. (Antoine Pitrou 구현; bpo-8104.)SocketServer모듈의TCPServer클래스가 이제 소켓 타임아웃과 Nagle 알고리즘 비활성화를 지원합니다.disable_nagle_algorithm클래스 속성의 기본값은False이며, 이를 True로 변경하면 새로운 요청 연결에 TCP_NODELAY 옵션이 설정되어 많은 양의 작은 전송을 하나의 TCP 패킷으로 버퍼링하는 것을 방지합니다.timeout클래스 속성에는 요청 소켓에 적용될 초 단위 타임아웃을 저장할 수 있으며, 해당 시간 내에 요청이 수신되지 않으면handle_timeout()이 호출되고handle_request()가 반환됩니다. (Kristján Valur Jónsson 기여; bpo-6192, bpo-6267.)업데이트된 모듈:
sqlite3모듈이 pysqlite 패키지 <https://github.com/ghaering/pysqlite>`__의 2.6.0 버전으로 업데이트되었습니다. 2.6.0 버전은 여러 버그 수정과 공유 라이브러리에서 SQLite 확장을 로드하는 기능을 포함합니다. 확장 기능을 활성화하려면 ``enable_load_extension(True)` 메서드를 호출하고, 특정 공유 라이브러리를 로드하려면load_extension()을 호출하십시오. (Gerhard Häring 업데이트.)ssl모듈의SSLSocket객체가 이제 buffer API를 지원하며, 이는 테스트 세트 실패를 해결하고(Antoine Pitrou 수정; bpo-7133) SSL 재협상을 유발하는recv()작업에서 오류 코드가 반환되지 않도록 OpenSSL의SSL_MODE_AUTO_RETRY`를 자동으로 설정합니다(Antoine Pitrou 수정; :issue:`8222).wrap_socket()생성자 함수가 이제 허용할 암호화 알고리즘을 나열한 문자열인 ciphers 인수를 받습니다. 문자열 형식은 OpenSSL 문서 <https://docs.openssl.org/1.0.2/man1/ciphers/>`에서 확인할 수 있습니다. (Antoine Pitrou 추가; :issue:`8322.)또 다른 변경 사항으로, 확장 프로그램이 모든 OpenSSL 암호 및 해시 알고리즘을 로드하여 모두 사용할 수 있도록 수정되었습니다. 이전에는 일부 SSL 인증서를 확인하지 못하고 “unknown algorithm” 오류를 보고하는 문제가 있었습니다. (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__()메서드를 시도하거나 오류를 보고하기 전에(Mark Dickinson 변경; :issue:`8300().)새 기능:
subprocess모듈의check_output()은 지정된 인자 세트와 함께 명령을 실행하고, 오류 없이 성공하면 출력 결과를 문자열로 반환하며 그렇지 않으면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모듈의is_declared_global()은 명시적으로 전역으로 선언된 변수에 대해 True를, 암시적으로 전역인 변수에 대해 False를 반환합니다. (Jeremy Hylton 기여.)syslog모듈은 이제 식별자로 기존 기본값인'python'대신sys.argv[0]의 값을 사용합니다. (Sean Reifschneider 변경; bpo-8451.)sys.version_info값이 이제major,minor,micro,releaselevel,serial`이라는 속성을 가진 네임드 튜플로 제공됩니다. (Ross Light 기여; :issue:`4285.)sys.getwindowsversion`은 또한 :attr:()!major`,minor,build,platform,service_pack,service_pack_major,service_pack_minor,suite_mask, 그리고product_type`이라는 속성을 가진 네임드 튜플을 반환합니다. (Brian Curtin 기여; :issue:`7766.)tarfile모듈의 기본 오류 처리 방식이 변경되어 더 이상 치명적인 오류를 억제하지 않습니다. 기존의 기본 오류 수준은 0이었으며, 이는 오류 발생 시 디버그 로그에만 메시지를 기록함을 의미했으나, 디버그 로그가 기본적으로 활성화되지 않기 때문에 이러한 오류들이 감지되지 않았습니다. 이제 기본 오류 수준은 1로 변경되어, 오류 발생 시 예외를 발생시킵니다. (Lars Gustäbel 변경; bpo-7357.)tarfile은 이제 타르 파일에 추가되는TarInfo객체를 필터링하는 기능을 지원합니다.add()를 호출할 때, 호출 가능한(callable) 형태의 선택적 filter 인수를 제공할 수 있습니다. filter 콜러블은 추가되는 모든 파일에 대한TarInfo객체를 전달받으며, 이를 수정하거나 반환할 수 있습니다. 만약 콜러블이None을 반환하면 해당 파일은 결과 아카이브에서 제외됩니다. 이는 기존의 exclude 인자보다 더 강력한 기능이므로, exclude 는 이제 폐지되었습니다. (Lars Gustäbel 추가; bpo-6856.) 또한TarFile클래스는 이제 컨텍스트 관리 프로토콜을 지원합니다. (Lars Gustäbel 추가; bpo-7232.)threading.Event클래스의wait()메서드는 이제 종료 시 내부 플래그를 반환합니다. 이는(Tim Lesher 기여; :issue:`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', '', '')
(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클래스는 요소에 대한 약한 참조(weak reference)만 보유하는 집합입니다. 요소를 가리키는 참조가 더 이상 없으면 해당 요소는 제거됩니다. (원래 Raymond Hettinger에 의해 Python 3.x에서 구현되었으며, Michael Foord에 의해 2.7로 역 이식되었습니다.)xml.etree.ElementTree라이브러리는 이제 XML 처리 지침(예:<?xml-stylesheet href="#style1"?>)이나 주석(예:<!-- comment -->)을 출력할 때 앰퍼샌드(&)와 꺽쇠(<, >)를 이스케이프하지 않습니다. (Neil Muller 패치; bpo-2746.)xmlrpclib및SimpleXMLRPCServer모듈이 제공하는 XML-RPC 클라이언트와 서버는 HTTP/1.1 keep-alive를 지원하고 교환되는 XML을 압축하기 위해 선택적으로 gzip 인코딩을 사용함으로써 성능이 향상되었습니다. gzip 압축은SimpleXMLRPCRequestHandler`의 :attr:!encode_threshold` 어트리뷰에 의해 제어되며, 이 값은 바이트 단위 크기를 포함합니다. 이보다 큰 응답은 압축됩니다. (Kristján Valur Jónsson 기여; bpo-6267.)zipfile모듈의(Brian Curtin 기여; :issue:`5511.)zipfile은 이제 빈 디렉터리를 아카이브에 포함하고 올바르게 추출하는 기능을 지원합니다. (Kuba Wieczorek 수정; bpo-4710.) 아카이브에서 파일을 읽는 속도가 빨라졌으며,read()와readline()을 혼용하여 사용하는 것이 이제 올바르게 작동합니다. (Nir Aides 기여; bpo-7610.)is_zipfile()함수는 이제 이전 버전에서 지원하던 경로 이름 외에도 파일 객체를 인자로 받을 수 있습니다. (Gabriel Genellina 기여; bpo-4756.)writestr()메서드에 이제 선택적인 compress_type 매개변수가 추가되어,ZipFile생성자에서 지정한 기본 압축 방식을 재정의할 수 있습니다. (Ronald Oussoren 기여; bpo-6003.)
새 모듈: importlib¶
Python 3.1은 Python의 import 문이 기반으로 하는 로직을 재구현한 importlib 패키지를 포함합니다. importlib 은 Python 인터프리터 구현자와 임포트 과정에 참여하는 새로운 임포터를 작성하려는 사용자에게 유용합니다. Python 2.7에는 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'>
importlib 은 Brett Cannon이 구현했으며 Python 3.1에 도입되었습니다.
새 모듈: sysconfig¶
sysconfig 모듈이 Distutils 패키지에서 분리되어 독립적인 최상위 모듈이 되었습니다. sysconfig 은 Python의 빌드 과정에 대한 정보(컴파일러 스위치, 설치 경로, 플랫폼 이름 및 Python이 소스 디렉터리에서 실행 중인지 여부 등)를 가져오는 함수를 제공합니다.
이 모듈의 일부 기능은 다음과 같습니다:
h()파일에서 변수를 가져옵니다.get_config_vars()는 모든 구성 변수를 포함하는 딕셔너리를 반환합니다.get_path()는 특정 유형의 모듈(표준 라이브러리, 사이트 전용 모듈, 플랫폼 전용 모듈 등)에 대해 설정된 경로를 반환합니다.is_python_build()는 Python 소스 트리에서 실행되는 바이너리인 경우 True를, 그렇지 않으면 False를 반환합니다.
더 자세한 내용과 전체 함수 목록은 sysconfig 문서를 참조하십시오.
Distutils 패키지와 sysconfig 은 이제 Tarek Ziadé가 관리하며, 그는 차세대 버전의 Distutils를 개발하기 위한 Distutils2 패키지(소스 저장소: https://hg.python.org/distutils2/)도 시작했습니다.
ttk: Tk를 위한 테마형 위젯¶
Tcl/Tk 8.5에는 기본 Tk 위젯을 재구현하면서도 더욱 맞춤화된 외형을 제공하여 네이티브 플랫폼의 위젯과 더 유사하게 보이도록 하는 테마형 위젯 세트가 포함되어 있습니다. 이 위젯 세트는 원래 Tile이라 불렸으나, Tcl/Tk 출시 8.5에 추가될 때 “themed Tk”를 의미하는 Ttk로 이름이 변경되었습니다.
더 자세한 내용은 ttk 모듈 문서를 읽어보십시오. 또한 Ttk 테마 엔진을 설명하는 Tcl/Tk 매뉴얼 페이지(https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html)를 읽어보는 것도 좋습니다. Python/Tkk 코드가 사용되는 몇 가지 스크린샷은 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 모듈 문서를 참조하십시오. (bpo-6001 에서 개발됨.)
main() 함수는 다음과 같은 다른 새로운 옵션들을 지원합니다:
-b또는--buffer는 각 테스트 동안 표준 출력 및 표준 에러 스트림을 버퍼링합니다. 테스트가 성공하면 결과 출력이 폐기되고, 실패하면 버퍼링된 출력이 표시됩니다.-c또는--catch는 control-C 인터럽트를 더 매끄럽게 처리하도록 합니다. 테스트 프로세스를 즉시 중단하는 대신 현재 실행 중인 테스트를 완료한 후 중단 시점까지의 부분 결과를 보고합니다. 성급하게 바로 중단하려면 control-C를 두 번 누르면 즉시 중단됩니다.이 control-C 처리기는 테스트 중인 코드나 실행 중인 테스트가 자체 시그널 처리기를 정의한 경우를 감지하여 이를 호출함으로써 문제를 일으키지 않도록 노력합니다. 이 방법이 작동하지 않는 경우, control-C 처리가 비활성화되어야 하는 테스트에 사용할 수 있는
removeHandler()데코레이터가 있습니다.-f또는--failfast`는 테스트가 실패할 때 나머지 테스트를 계속 실행하는 대신 즉시 중단합니다. (Cliff Dyer 제안, Michael Foord 구현; :issue:`8074.)
상세 모드(verbose mode)로 실행할 때, 예상된 실패는 ‘x’, 예기치 않은 성공은 ‘u’로 진행 메시지가 표시됩니다. (Benjamin Peterson 기여.)
테스트 케이스는 테스트를 건너뛰기 위해 SkipTest 예외를 발생시킬 수 있습니다. (bpo-1034053.)
assertEqual(), assertTrue(), 그리고 assertFalse() 실패 시 오류 메시지에 더 많은 정보가 제공됩니다. TestCase 클래스의 longMessage 속성을 true로 설정하면, 실패 시 표준 오류 메시지와 사용자가 제공한 추가 메시지가 모두 출력됩니다. (Michael Foord 추가; bpo-5663.)
assertRaises() 메서드는 실행할 호출 가능 객체를 제공하지 않고 호출될 때 컨텍스트 핸들러를 반환합니다. 예를 들어, 다음과 같이 작성할 수 있습니다:
with self.assertRaises(KeyError):
{}['foo']
(Antoine Pitrou에 의해 구현됨; bpo-4444.)
모듈 및 클래스 수준의 setup 및 teardown fixture를 이제 지원합니다. 모듈은 setUpModule() 및 tearDownModule() 함수를 포함할 수 있습니다. 클래스는 반드시 클래스 메서드(@classmethod 또는 그와 동등한 방식 사용)로 정의되어야 하는 setUpClass() 및 tearDownClass() 메서드를 가질 수 있습니다. 이러한 함수와 메서드는 테스트 러너가 다른 모듈이나 클래스에 있는 테스트 케이스로 전환할 때 호출됩니다.
addCleanup() 및 doCleanups() 메서드가 추가되었습니다. addCleanup() 을 사용하면 조건 없이 실행될 정리(cleanup) 함수를 추가할 수 있습니다(무조건적으로, 또는 setUp() 이 실패할 경우 setUp() 이후에 호출되며, 그렇지 않으면 tearDown() 후에 호출됩니다). 이를 통해 테스트 중에 리소스를 할당하고 해제하는 과정이 훨씬 간단해집니다 (bpo-5679).
더욱 특화된 테스트를 제공하는 여러 새로운 메서드가 추가되었습니다. 이러한 메서드 중 상당수는 Google 엔지니어들이 자사의 테스트 제품군에서 사용하기 위해 작성한 것이며, Gregory P. Smith, Michael Foord 및 GvR이 이를 파이썬의 unittest 버전으로 통합하는 작업을 수행했습니다.
assertIsNone()및assertIsNotNone()은 하나의 표현식을 받아 그 결과가None인지 또는None이 아닌지 확인합니다.assertIs()및(Michael Foord에 의해 추가됨; :issue:`2578().)assertIsInstance()및(Georg Brandl에 의해 추가됨; :issue:`7031().)assertGreater(),assertGreaterEqual(),assertLess(), 및assertLessEqual()는 두 양을 비교합니다.assertMultiLineEqual()은 두 문자열을 비교하며, 같지 않을 경우 두 문자열의 차이점을 강조하는 유용한 비교 결과를 표시합니다. 이제 Unicode 문자열을assertEqual()로 비교할 때 이 비교가 기본으로 사용됩니다.assertRegexpMatches()및assertNotRegexpMatches() <unittest.TestCase.assertNotRegex>`는 첫 번째 인자가 두 번째 인자로 제공된 정규 표현식과 일치하는지 여부를 확인합니다 (:issue:`8038()).assertRaisesRegexp()는 특정 예외가 발생했는지 확인한 후, 해당 예외의 문자열 표현이 제공된 정규 표현식과 일치하는지 여부를 확인합니다.assertIn()및assertNotIn()은 첫 번째 항목이 두 번째 항목에 포함되어 있는지 여부를 테스트합니다.assertItemsEqual()는 제공된 두 시퀀스가 동일한 요소를 포함하고 있는지 테스트합니다.assertSetEqual()은 두 집합이 같은지 비교하며, 오류 발생 시에만 집합 간의 차이점을 보고합니다.마찬가지로,
assertListEqual()및assertTupleEqual()은 지정된 유형을 비교하며 전체 값을 출력하지 않고도 차이점을 설명합니다. 이 메서드들은 이제assertEqual()를 사용하여 리스트와 튜플을 비교할 때 기본으로 사용됩니다. 더 일반적으로,assertSequenceEqual()은 두 시퀀스를 비교하며 선택적으로 두 시퀀스가 특정 유형인지 확인할 수 있습니다.assertDictEqual()는 두 딕셔너리를 비교하고 그 차이점을 보고합니다. 이제assertEqual()을 사용하여 두 딕셔너리를 비교할 때 기본으로 사용됩니다.assertDictContainsSubset()은 첫 번째 의 모든 키/값 쌍이 두 번째 에서 발견되는지 확인합니다.assertAlmostEqual()및assertNotAlmostEqual()는 첫 번째 와 두 번째 가 거의 동일한지 테스트합니다. 이 메서드는 차이를 선택적으로 지정된 자리수 (기본값은 7)로 반올림하여 0과 비교하거나, 차이가 제공된 delta 값보다 작은지 확인하도록 할 수 있습니다.loadTestsFromName()이TestLoader의suiteClass속성을 올바르게 준수합니다. (Mark Roddy에 의해 수정됨; bpo-6866.)새로운 훅을 사용하여
assertEqual()메서드를 확장하여 새로운 데이터 유형을 처리할 수 있습니다.addTypeEqualityFunc()메서드는 타입 객체와 함수를 받습니다. 비교되는 두 객체가 모두 해당 타입인 경우 이 함수가 사용됩니다. 이 함수는 두 객체를 비교하고 일치하지 않으면 예외를 발생시켜야 하며, 새로운 시퀀스 비교 메서드들처럼 두 객체가 일치하지 않는 이유에 대한 추가 정보를 제공하는 것이 좋습니다.
unittest.main() 이 이제 선택적인 exit 인자를 받습니다. 이 값이 False이면 main() 이 sys.exit() 를 호출하지 않으므로, 대화형 인터프리터에서 main() 을 사용할 수 있습니다. (J. Pablo Fernández가 기여함; bpo-3379.)
TestResult 에 테스트 실행 직전과 직후에 호출되는 새로운 startTestRun() 및 stopTestRun() 메서드가 추가되었습니다. (Robert Collins가 기여함; bpo-5728.)
이러한 모든 변경 사항으로 인해 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으로 업데이트되었습니다. 새로운 기능 중 일부는 다음과 같습니다:
다양한 파싱 함수가 이제 사용될
XMLParser인스턴스를 제공하는 parser 키워드 인수를 받습니다. 이를 통해 파일의 내부 인코딩을 재정의할 수 있습니다.p = ET.XMLParser(encoding='utf-8') t = ET.XML("""<root/>""", parser=p)
XML 파싱 오류 발생 시 이제
ParseError예외를 발생시키며, 해당 인스턴스는 문제의 위치를 나타내는 (줄, 열) 튜플을 포함하는position속성을 가집니다.ElementTree가 트리를 문자열로 변환하는 코드가 크게 개선되어 많은 경우 약 두 배 더 빨라졌습니다. 이제
ElementTree.write()및Element.write()메서드는 “xml”(기본값), “html”, 또는 “text”가 될 수 있는 method 인수를 가집니다. HTML 모드는 빈 요소를<empty></empty>로 출력하며, 텍스트 모드에서는 요소는 건너뛰고 텍스트 청크만 출력합니다. 만약 요소의tag속성을None으로 설정하지만 자식 요소는 그대로 두면, 해당 요소는 트리가 작성될 때 생략되므로 단일 요소를 제거하기 위해 광범위한 재배열을 할 필요가 없습니다.네임스페이스 처리 또한 개선되었습니다. 모든
xmlns:<whatever>` 선언은 이제 결과 XML 전체에 흩어지지 않고 루트 엘리먼트에 출력됩니다.default_namespace속성을 설정하여 트리의 기본 네임스페이스를 지정할 수 있으며,register_namespace()을 사용하여 새로운 접두사를 등록할 수 있습니다. XML 모드에서는 true/false인 xml_declaration 파라미터를 사용하여 XML 선언을 생략할 수 있습니다.New
Elementmethod:extend()appends the items from a sequence to the element’s children. Elements themselves behave like sequences, so it’s easy to move children from one element to another:from xml.etree import ElementTree as ET t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") new = ET.XML('<root/>') new.extend(t) # Outputs <root><item>1</item>...</root> print ET.tostring(new)
New
Elementmethod:iter()yields the children of the element as a generator. It’s also possible to writefor child in elem:to loop over an element’s children. The existing methodgetiterator()is now deprecated, as isgetchildren()which constructs and returns a list of children.New
Elementmethod:itertext()yields all chunks of text that are descendants of the element. For example:t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") # Outputs ['\n ', '1', ' ', '2', ' ', '3', '\n'] print list(t.itertext())
폐지됨: 엘리먼트를 불리언 값으로 사용하는 경우(예:
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에서의 논의와 bpo-6472 를 바탕으로 파이썬에 포함된 버전을 업데이트했습니다.
빌드 및 C API 변경사항¶
Python 빌드 프로세스 및 C API의 변경 사항은 다음과 같습니다:
최신 릴리스인 GNU 디버거 GDB 7은 파이썬을 사용하여 스크립팅할 수 있습니다. 실행 가능한 프로그램 P를 디버깅하기 시작하면, GDB는
P-gdb.py라는 이름의 파일을 찾아 자동으로 읽습니다. Dave Malcolm은 파이썬 자체를 디버깅할 때 유용한 여러 명령어를 추가하는python-gdb.py를 기여했습니다. 예를 들어,py-up과py-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.)새로운 함수:
PyFrame_GetLineNumber()는 프레임 객체를 받아 현재 실행 중인 줄 번호를 반환합니다. 이전에는 코드가 현재 실행 중인 바이트코드 명령의 인덱스를 가져온 다음, 해당 주소에 해당하는 줄 번호를 찾아야 했습니다. (Jeffrey Yasskin에 의해 추가됨.)새로운 함수들:
PyLong_AsLongAndOverflow()및PyLong_AsLongLongAndOverflow()는 파이썬 긴(long) 정수를 C 타입인 long 또는 long long 으로 근사화합니다. 숫자가 출력형에 들어갈 만큼 충분히 크지 않은 경우, overflow 플래그가 설정되어 호출자에게 반환됩니다. (Case Van Horsen에 의해 기여됨; bpo-7528 및 bpo-7767.)새로운 함수: 문자열을 실수(float)로 변환하는 방식의 재작성으로 인해 새로운
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라는 이름의 파일)을 배치하면 애플리케이션이 이를 임포트하고 실행하게 되는 문제를 야기했습니다.파이썬을 내장하는 C/C++ 애플리케이션을 관리하는 경우,
PySys_SetArgv`를 호출하고 있는지 확인하고, 해당 애플리케이션이 *updatepath*를 false로 설정한 :c:func:()!PySys_SetArgvEx`를 사용해야 하는지 신중하게 검토하십시오.CVE 2008-5983 으로 보고된 보안 이슈이며, bpo-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.)스레드와 프로세스 포킹 간의 복잡한 상호작용이 변경되었습니다. 이전에는
os.fork()에 의해 생성된 자식 프로세스가 실패할 수 있었는데, 이는 자식 프로세스가os.fork()를 수행하는 단 하나의 스레드만 실행되는 상태로 생성되기 때문입니다. 만약 포크가 수행될 때 다른 스레드가 파이썬의 임포트 잠금과 같은 락을 보유하고 있었다면, 새 프로세스에서도 해당 락은 여전히 “보유 중”으로 표시되었습니다. 그러나 자식 프로세스에서는 다른 스레드들이 복제되지 않았기 때문에 어떤 것도 해당 락을 해제할 수 없었고, 결과적으로 자식 프로세스는 더 이상 임포트를 수행할 수 없게 되었습니다.Python 2.7은
os.fork()를 수행하기 전에 임포트 잠금을 획득하며,threading모듈을 사용하여 생성된 모든 잠금을 정리합니다. 내부 잠금을 보유하거나 직접fork()를 호출하는 C 확장 모듈은 이 정리 작업의 혜택을 받지 못합니다.(Thomas Wouters에 의해 수정됨; bpo-1590864.)
Py_Finalize()함수가 이제 내부threading._shutdown()함수를 호출합니다. 이를 통해 인터프리터 종료 시 일부 예외가 발생하는 것을 방지합니다. (Adam Olsen의 패치; bpo-1722344.)타입의 어트리뷰트를 정의하기 위해
PyMemberDef구조를 사용할 때, 파이썬은 더 이상T_STRING_INPLACE어트리뷰트를 삭제하거나 설정하려고 시도하는 것을 허용하지 않습니다.ctypes모듈에 의해 정의된 전역 심볼이 이제Py또는_ctypes접두사가 붙습니다. (Thomas Heller가 구현; bpo-3102.)새로운 구성 옵션:
--with-system-expat스위치를 사용하면pyexpat모듈이 시스템 Expat 라이브러리를 사용하여 빌드되도록 할 수 있습니다. (Arfrever Frehtes Taifersar Arahesis가 기여; bpo-7609.)새로운 구성 옵션:
--with-valgrind옵션은 이제 Valgrind 메모리 오류 탐지기가 정확하게 분석하기 어려운 pymalloc 할당기를 비활성화합니다. 따라서 Valgrind가 메모리 누수 및 오버런을 더 잘 감지할 수 있게 됩니다. (James Henstridge가 기여; bpo-2422.)새로운 구성 옵션: 이제
--with-dbmliborder=`에 빈 문자열을 제공하여 다양한 DBM 모듈을 모두 비활성화할 수 있습니다. (Arfrever Frehtes Taifersar Arahesis가 추가; :issue:`6491.)configure 스크립트가 이제 특정 32비트 Intel 칩에서 발생하는 부동 소수점 반올림 버그를 확인하고
X87_DOUBLE_ROUNDING전처리 정의를 정의합니다. 현재 이 정의를 사용하는 코드는 없지만, 필요할 경우 사용할 수 있습니다. (Mark Dickinson이 추가; bpo-2937.)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 adds a new C datatype, PyCapsule, for providing a
C API to an extension module. A capsule is essentially the holder of
a C void * pointer, and is made available as a module attribute; for
example, the socket module’s API is exposed as socket.CAPI,
and unicodedata exposes ucnhash_CAPI. Other extensions
can import the module, access its dictionary to get the capsule
object, and then get the void * pointer, which will usually point
to an array of pointers to the module’s various API functions.
이 용도로 이미 사용되는 데이터 형인 PyCObject 가 있지만, 이는 타입 안전성을 제공하지 않습니다. 순수 파이썬으로 작성된 악성 코드가 모듈 A의 PyCObject 를 가져와 모듈 B의 PyCObject 로 대체함으로써 세그멘테이션 오류를 발생시킬 수 있습니다. 캡슐은 자신만의 이름을 알고 있으며, 포인터를 가져오려면 해당 이름을 제공해야 합니다.
void *vtable;
if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
PyErr_SetString(PyExc_ValueError, "argument type invalid");
return NULL;
}
vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");
vtable 이 기대한 대로 가리키고 있음을 보장받을 수 있습니다. 다른 캡슐이 전달된 경우, PyCapsule_IsValid() 가 이름 불일치를 감지하고 false를 반환합니다. 이 객체들의 사용에 관한 자세한 정보는 확장 모듈을 위한 C API 제공하기 를 참조하십시오.
Python 2.7은 이제 내부적으로 다양한 확장 모듈 API를 제공하기 위해 캡슐을 사용하지만, PyCObject_AsVoidPtr() 은 캡슐을 처리할 수 있도록 수정되어 PyCObject 인터페이스와의 컴파일 타임 호환성을 유지합니다. PyCObject_AsVoidPtr() 사용 시 기본적으로는 조용하게 넘어가는 PendingDeprecationWarning 이 발생합니다.
Python 3.1에서 구현되었으며 Larry Hastings에 의해 2.7으로 백포트되었습니다. bpo-5630 에서 논의됨.
포트별 변경 사항: Windows¶
msvcrt모듈이 이제crtassem.h헤더 파일의 일부 상수를 포함합니다:CRT_ASSEMBLY_VERSION,VC_ASSEMBLY_PUBLICKEYTOKEN, 그리고LIBRARIES_ASSEMBLY_NAME_PREFIX. (David Cournapeau가 기여; bpo-4365.)레지스트리 액세스를 위한
_winreg모듈이 이제 기존에 지원되던 함수들의 확장 버전인CreateKeyEx()및DeleteKeyEx()기능을 구현하며, 이들은 여러 추가 인자를 받습니다. 또한DisableReflectionKey(),EnableReflectionKey(), 그리고QueryReflectionKey()기능도 테스트되고 문서화되었습니다. (Brian Curtin이 구현; bpo-7347.)스레드를 시작하는 데 새로운
_beginthreadex()API를 사용하며, 이제 네이티브 스레드 로컬 저장소 함수가 사용됩니다. (Kristján Valur Jónsson이 기여; bpo-3582.)os.kill()함수가 이제 Windows에서도 작동합니다. 시그널 값은 상수인CTRL_C_EVENT,CTRL_BREAK_EVENT, 또는 임의의 정수일 수 있습니다. 처음 두 상수는 하위 프로세스에 Control-C 및 Control-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 설치 프로그램과 같은 사용자 설치형 파이썬의sys.path에 추가되지 않습니다. macOS 10.12부터 Apple은 시스템 site-packages 디렉터리 설정 방식을 변경했으며, 이로 인해 setuptools와 같은 pip 구성 요소의 설치가 실패할 수 있습니다. 시스템용 Python을 위해 설치된 패키지는 더 이상 사용자 설치형 파이썬과 공유되지 않습니다. (bpo-28440)
포트별 변경 사항: FreeBSD¶
대체 라우팅 테이블을 선택하기 위해
socket()메서드인getsockopt()/1의 :const:()!SO_SETFIB` 상수가 이제socket모듈에서 사용할 수 있습니다. (Kyle VanderBeek이 추가; bpo-8235.)
기타 변경 사항 및 수정¶
Tools디렉터리에 두 개의 벤치마크 스크립트인iobench와ccbench가 추가되었습니다.iobench는 다양한 작업을 수행하는 동안open()이 반환하는 내장 파일 I/O 객체의 속도를 측정하며,ccbench는 가변적인 수의 스레드를 사용하여 여러 작업을 수행할 때 계산 처리량, 스레드 전환 지연 시간 및 IO 처리 대역폭을 측정하는 동시성 벤치마크입니다.Tools/i18n/msgfmt.py스크립트가 이제.po파일의 복수 형태를 인식합니다. (Martin von Löwis가 수정; bpo-5464.)기존의
.py파일이 있는 경우, 해당 파일의 대응되는.pyc또는.pyo파일에서 모듈을 임포트할 때 원본 파일명이 더 이상 유효하지 않으면 결과 코드 객체의co_filename속성이 덮어써집니다. 이는 파일의 이름이 변경되거나 위치가 이동되었거나, 또는 다른 경로를 통해 접근할 때 발생할 수 있습니다. (Ziga Seilnacht 및 Jean-Paul Calderone의 패치; bpo-1180193.)regrtest.py스크립트가 이제--randseed=스위치를 지원합니다. 이 스위치는 무작위 순서로 테스트를 실행하는-r옵션에 사용될 난수 시드(seed)용 정수를 입력받습니다. 또한-r옵션은 사용된 시드를 보고합니다. (Collin Winter가 추가.)regrtest.py`의 또 다른 스위치는 병렬로 실행할 테스트 수를 지정하는 정수를 받는 :option:!-j`입니다. 이를 통해 멀티코어 머신에서 전체 실행 시간을 단축할 수 있습니다. 이 옵션은 긴 실행 시간을 발생시키는 것으로 알려진-R스위치를 포함한 여러 다른 옵션과 호환됩니다. (Antoine Pitrou가 추가, bpo-6152.) 또한 실패할 때까지 선택된 테스트를 루프 내에서 실행하는 새로운-F스위치와 함께 사용할 수 있습니다. (Antoine Pitrou가 추가; bpo-7312.)스크립트로 실행될 때,
py_compile.py모듈이 이제'-'를 인자로 받아 컴파일할 파일 목록을 표준 입력에서 읽어옵니다. (Piotr Ożarowski가 기여; bpo-8233.)
Python 2.7으로 이식¶
이 섹션에서는 앞서 설명한 변경 사항과 코드 수정이 필요할 수 있는 기타 버그 수정을 나열합니다.
range()함수가 인자를 보다 일관되게 처리합니다. 이제 플로트(float)나 정수(integer)가 아닌 타입의 인자가 제공되면(Alexander Belopolsky가 수정; :issue:`1533().)문자열(string)
format()메서드의 부동 소수점 및 복소수에 대한 기본 정밀도가 소수점 6자리에서 12자리로 변경되었으며, 이는str`이 사용하는 정밀도와 일치합니다. (Eric Smith가 수정; :issue:`5920().)with문에 대한 최적화로 인해 특별 메서드인__enter__()및__exit__()는 반드시 객체의 타입에 속해야 하며, 객체의 인스턴스에 직접 연결될 수 없습니다. 이는 새로운 스타일의 클래스(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)을 포함하는 비교는 이제 비교 연산자에 따라 true 또는 false를 조용히 반환하는 대신조용한 NaN 값(또는 ``NaN`)은 이제 해시 가능합니다. (Mark Dickinson이 수정; bpo-7279.)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.)tarfile모듈의 기본 오류 처리 방식이 변경되어 더 이상 치명적인 오류를 억제하지 않습니다. 기존의 기본 오류 수준은 0이었으며, 이는 오류 발생 시 디버그 로그에만 메시지를 기록함을 의미했으나, 디버그 로그가 기본적으로 활성화되지 않기 때문에 이러한 오류들이 감지되지 않았습니다. 이제 기본 오류 수준은 1로 변경되어, 오류 발생 시 예외를 발생시킵니다. (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', '', '')
(Python 2.7은 표준 튜플 대신 네임드 튜플을 반환하므로 실제로는 약간 다른 출력을 생성합니다.)
C 확장을 위한 사항:
PyArg_Parse*계열 함수와 함께 정수 포맷 코드를 사용하는 C 확장은 이제DeprecationWarning을 발생시키는 대신TypeError예외를 발생시킵니다. (bpo-5080.)이제 사용이 권장되지 않는(deprecated) 기존의
PyOS_ascii_strtod()및PyOS_ascii_atof()함수 대신 새로운PyOS_string_to_double()함수를 사용하십시오.
Python을 내장하는 애플리케이션을 위한 사항:
기존의
PySys_SetArgv()함수를 사용할 때 발생할 수 있는 보안 취약점을 해결하기 위해PySys_SetArgvEx()함수가 추가되었습니다. 현재PySys_SetArgv`를 호출하고 있는지 확인하고, 애플리케이션이 *updatepath*를 false로 설정한 :c:func:()!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: 모든 분기(Branch)를 위한 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에서 추가됨:
타이밍 공격에 강한 비교 연산을 Python 2 애플리케이션에서도 사용할 수 있도록
hmac.compare_digest`를 Python 3에서 백포트했습니다. (Alex Gaynor가 기여; :issue:`21306().)python.org에서 발표된 공식 Windows 설치 프로그램에서 OpenSSL 1.0.1g가 업그레이드되었습니다. (Zachary Ware가 기여; bpo-21462.)
PEP 466 관련 기능이 Python 2.7.8에서 추가됨:
보안이 강화된 비밀번호 저장에 적합한 해싱 알고리즘을 Python 2 애플리케이션에서 널리 사용할 수 있도록
hashlib.pbkdf2_hmac`를 Python 3에서 백포트했습니다. (Alex Gaynor가 기여; :issue:`21304().)python.org에서 발표된 공식 Windows 설치 프로그램을 위해 OpenSSL 1.0.1h가 업그레이드되었습니다. (Zachary Ware가 bpo-21671 를 통해 CVE 2014-0224 에 대응함.)
PEP 466 관련 기능이 Python 2.7.9에서 추가됨:
Python 3.4의
ssl모듈 대부분이 백포트되었습니다. 즉, 이제ssl은 Server Name Indication, TLS1.x 설정, 플랫폼 인증서 저장소 접근,SSLContext클래스 및 기타 기능들을 지원합니다. (Alex Gaynur와 David Reid가 기여; bpo-21308.)구체적인 내용은 모듈 문서의 “Version added: 2.7.9” 항목을 참조하십시오.
os.urandom`이 매 호출 시마다 `()/dev/urandom``을 다시 여는 대신, 해당 파일의 기술자를 캐싱하도록 변경되었습니다. (Alex Gaynor가 기여; bpo-21305.)hashlib.algorithms_guaranteed및hashlib.algorithms_available이 Python 3에서 백포트되어, Python 2 애플리케이션에서 사용 가능한 가장 강력한 해시 알고리즘을 더 쉽게 선택할 수 있게 되었습니다. (Alex Gaynor가 bpo-21307 에서 기여)
PEP 477: ensurepip(PEP 453)을 Python 2.7로 백포트¶
PEP 477 은 Python 2.7 유지 관리 릴리스에 PEP 453 ensurepip 모듈과 그로 인해 개선된 문서를 포함하는 것을 승인하며, 이는 첫 번째로 Python 2.7.9 릴리스부터 적용됩니다.
기본값으로 pip 부트스트랩¶
새로운 ensurepip 모듈(PEP 453 에 정의됨)은 Python 설치 환경에 pip 설치 프로그램을 부트스트랩하기 위한 표준 교차 플랫폼 메커니즘을 제공합니다. Python 2.7.9에 포함된 pip 버전은 1.5.6이며, 향후 2.7.x 유지 관리 릴리스에서는 번들 버전을 릴리스 후보 생성 시점에 사용 가능한 최신 버전으로 업데이트할 예정입니다.
기본적으로, 모든 플랫폼에서 pip 파이썬 패키지 및 관련 종속성과 함께 pip, pipX, pipX.Y 명령어가 설치됩니다(여기서 X.Y는 파이썬 설치 버전을 나타냅니다).
CPython POSIX 시스템의 소스 빌드 의 경우, make install 및 make altinstall 명령은 기본적으로 pip 를 부트스트랩하지 않습니다. 이 동작은 configure 옵션을 통해 제어하거나 Makefile 옵션을 통해 재정의할 수 있습니다.
Windows 및 Mac OS X에서 CPython 설치 프로그램은 이제 CPython과 함께 pip 를 설치하는 것을 기본값으로 합니다(사용자는 설치 과정 중에 이를 선택적으로 제외할 수 있습니다). Windows 사용자가 명령줄에서 pip 을 기본으로 사용할 수 있게 하려면 자동 PATH 수정을 허용해야 하며, 그렇지 않은 경우에도 Windows용 Python 런처를 통해 py -m pip 으로 액세스할 수 있습니다.
PEP 에서 논의된 바와 같이`, 플랫폼 패키저들은 실행 시 해당 플랫폼에 설치하는 방법(일반적으로 시스템 패키지 관리자 사용)을 명확하고 간단하게 안내한다면 기본으로 이러한 명령들을 설치하지 않기로 선택할 수 있습니다.
문서 변경 사항¶
이 변경의 일환으로, 문서의 Python 모듈 설치하기 및 파이썬 모듈 배포하기 섹션이 짧은 시작 가이드 및 FAQ 문서로 완전히 재설계되었습니다. 대부분의 패키징 관련 문헌은 이제 Python Packaging Authority에서 관리하는 Python Packaging User Guide 및 개별 프로젝트의 문서로 이동되었습니다.
그러나 이 마이그레이션이 아직 완료되지 않았으므로, 해당 가이드의 이전 버전이 setuptools로 C와 C++ 확장 빌드하기 및 setuptools로 C와 C++ 확장 빌드하기 로 남아 있습니다.
더 보기
- PEP 453 – 파이썬 설치 시 pip의 명시적 부트스트랩
Donald Stufft와 Nick Coghlan이 작성하고, Donald Stufft, Nick Coghlan, Martin von Löwis, Ned Deily가 구현한 PEP입니다.
PEP 476: 표준 라이브러리(stdlib) HTTP 클라이언트에 대해 기본적으로 인증서 확인 활성화¶
PEP 476 은 httplib 및 이를 사용하는 urllib2, xmlrpclib 등의 모듈을 업데이트하여, 서버가 플랫폼 신뢰 저장소 내의 인증 기관(Certificate Authority)에 의해 서명되고 요청된 호스트 이름과 일치하는 인증서를 제공하는지 기본적으로 확인하도록 합니다. 이는 많은 애플리케이션의 보안을 크게 향상시킵니다. 이 변경 사항은 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 2.7.8 이전 버전의 기본 관대한 동작 방식으로 되돌릴 수 있습니다.
연결 수립 코드는 수정할 수 없지만 전체 애플리케이션은 수정 가능한 경우, 새로운 ssl._https_verify_certificates() 함수를 사용하여 실행 중에 기본 동작을 조정할 수 있습니다.
새로운 make regen-all 빌드 대상¶
크로스 컴파일을 단순화하고 기존 파이썬 버전이 이미 준비되어 있지 않아도 CPython을 안정적으로 컴파일할 수 있도록 하기 위해, autotools 기반 빌드 시스템은 더 이상 파일 수정 시간을 기반으로 생성된 파일을 암시적으로 재컴파일하려고 시도하지 않습니다.
대신, 원할 때(예를 들어 사전 생성된 버전을 기반으로 파이썬의 초기 버전이 이미 빌드된 후) 이러한 파일들을 강제로 재생성하는 새로운 make regen-all 명령이 추가되었습니다.
더 선택적인 재생성 대상들도 정의되어 있습니다. 자세한 내용은 Makefile.pre.in 을 참조하십시오.
(Victor Stinner가 bpo-23404 를 통해 기여함.)
Added in version 2.7.14.
make touch 빌드 대상 제거¶
파일 수정 시간을 업데이트하여 생성된 파일의 암시적 재생성을 요청하는 데 사용되던 make touch 빌드 대상이 제거되었습니다.
이는 새로운 make regen-all 대상으로 대체되었습니다.
(Victor Stinner가 bpo-23404 를 통해 기여함.)
버전 2.7.14에서 변경.
감사의 말¶
필자는 이 문서의 여러 초안에 대해 제안, 수정 및 도움을 준 다음 분들에게 감사드립니다: Nick Coghlan, Philip Jenvey, Ryan Lovett, R. David Murray, Hugh Secker-Walker.