파이썬 3.4의 새로운 기능¶
- 저자:
R. David Murray <rdmurray@bitdance.com> (편집자)
이 문서는 파이썬 3.3과 비교하여 파이썬 3.4에서 새롭게 추가된 기능을 설명합니다. 파이썬 3.4는 2014년 3월 16일에 출시되었습니다. 자세한 내용은 changelog 를 참조하십시오.
더 보기
PEP 429 – 파이썬 3.4 출시 일정
요약 – 배포 주요 사항¶
새로운 문법 기능:
파이썬 3.4에서는 새로운 구문 기능이 추가되지 않았습니다.
기타 새로운 기능:
고립 모드 <whatsnew-isolated-mode>`를 위한 명령줄 옵션 (:issue:`16499).
텍스트 인코딩이 아닌 코덱 처리에 대한 개선 사항 (Codec 처리 개선 또는 여러 이슈).
임포트 시스템을 위한 ModuleSpec 형 (PEP 451). (임포터 작성자에게 영향을 미칩니다.)
marshal형식이 더 조밀하고 효율적으로 개선되었습니다 (bpo-16475).
새로운 라이브러리 모듈:
selectors:select모듈 프리미티브를 기반으로 구축된 고수준의 효율적인 I/O 멀티플렉싱 (PEP 3156 의 일부).statistics: 기본적이고 수치적으로 안정적인 통계 라이브러리 (PEP 450).
상당히 개선된 라이브러리 모듈:
functools내의 단일 디스패치 제네릭 함수 (PEP 443).multiprocessing에 이제 Unix에서 os.fork 사용을 피하는 옵션 이 포함됩니다 (bpo-8713).email에 새로운 서브모듈인contentmanager와 MIME 처리를 간소화하는 새Message하위 클래스(EmailMessage)가 추가되었습니다 (bpo-18891).inspect및pydoc모듈이 훨씬 더 다양한 유형의 호출 가능한 객체를 올바르게 조사(introspection)할 수 있게 되어 파이썬help()시스템의 출력이 개선되었습니다.ipaddress모듈 API가 안정 상태로 선언되었습니다.
보안 개선 사항:
자식 프로세스에 파일 기술자가 노출되는 것을 방지하기 위해 새로 생성된 파일 기술자를 상속 불가능하게 설정 (PEP 446).
multiprocessing에 이제 Unix에서 os.fork 사용을 피하는 옵션 이 포함됩니다. spawn 과 forkserver 는 자식 프로세스와 데이터를 공유하지 않으므로 더 안전합니다.Windows에서
multiprocessing자식 프로세스는 더 이상 부모의 모든 상속 가능 핸들을 상속하지 않고 필요한 것만 상속합니다.새로운
hashlib.pbkdf2_hmac()함수가 PKCS#5 암호 기반 키 파생 함수 2 를 제공합니다.ssl을 위한 TLSv1.1 및 TLSv1.2 지원.표준 라이브러리의 모든 SSL 지원 모듈은 이제 호스트 이름 매칭(
ssl.match_hostname()) 및 CRL(인증서 폐기 목록,ssl.SSLContext.load_verify_locations()참조)을 포함한 서버 인증서 검증을 지원합니다.
CPython 구현 개선 사항:
PEP 442 를 활용하여 대부분의 경우 종료 시 모듈 전역 변수가 더 이상 None으로 설정되지 않습니다 (bpo-18214).
사용자 대상 변경 사항과 기타 소규모 개선 사항, CPython 최적화, 폐지된 기능 및 잠재적인 이식 문제에 대한 전체 목록을 계속 읽어보시기 바랍니다.
새로운 기능¶
PEP 453: 파이썬 설치 시 PIP의 명시적 부트스트랩¶
기본값으로 pip 부트스트랩¶
새로운 ensurepip 모듈(PEP 453 에 정의됨)은 파이썬 설치 및 가상 환경에 pip 설치 프로그램을 부트스트랩하는 표준 교차 플랫폼 메커니즘을 제공합니다. Python 3.4.0에 포함된 pip 버전은 1.5.4이며, 향후 3.4.x 유지 관리 릴리스에서는 번들 버전을 릴리스 후보 생성 시 사용 가능한 최신 pip 버전으로 업데이트할 예정입니다.
기본적으로 모든 플랫폼에 pipX 및 pipX.Y 명령이 설치됩니다(여기서 X.Y는 파이썬 설치 버전을 나타냄). 또한 pip 파이썬 패키지와 그 의존성도 함께 설치됩니다. Windows와 모든 플랫폼의 가상 환경에서는 버전이 표시되지 않는 pip 명령도 설치됩니다. 다른 플랫폼에서 버전이 없는 시스템 전체 pip 명령은 일반적으로 별도로 설치된 Python 2 버전을 가리킵니다.
pyvenv 명령줄 유틸리티와 venv 모듈은 가상 환경에서 pip 을 즉시 사용할 수 있도록 ensurepip 모듈을 사용합니다. 명령줄 유틸리티를 사용할 때는 pip 이 기본적으로 설치되지만, venv 모듈을 사용할 때 API 는 pip 설치를 명시적으로 요청해야 합니다.
CPython source builds on POSIX systems 의 경우, make install 및 make altinstall 명령이 기본적으로 pip 을 부트스트랩합니다. 이 동작은 configure 옵션을 통해 제어하거나 Makefile 옵션을 통해 재정의할 수 있습니다.
Windows 및 Mac OS X에서 CPython 설치 프로그램은 이제 CPython과 함께 pip 를 설치하는 것을 기본값으로 합니다(사용자는 설치 과정 중에 이를 선택적으로 제외할 수 있습니다). Windows 사용자가 명령줄에서 pip 을 기본으로 사용할 수 있게 하려면 자동 PATH 수정을 허용해야 하며, 그렇지 않은 경우에도 Windows용 Python 런처를 통해 py -m pip 으로 액세스할 수 있습니다.
discussed in the PEP 에 따라 플랫폼 패키지 제작자는 해당 명령이 호출될 때 시스템 패키지 관리자를 사용하여 설치하는 방법에 대한 명확하고 단순한 안내를 제공하는 한, 기본적으로 이러한 명령을 설치하지 않기로 선택할 수 있습니다.
참고
병렬로 실행되는 Python 2와 Python 3 설치 간의 충돌을 피하기 위해, ensurepip 가 직접 호출될 때는 버전이 지정된 pip3 및 pip3.4 명령만 기본적으로 부트스트랩됩니다. 버전이 없는 pip 명령도 요청하려면 --default-pip 옵션이 필요합니다. pyvenv 및 Windows 설치 프로그램은 해당 환경에서 이름 없는 pip 명령이 사용 가능하도록 보장하며, 여러 파이썬 설치가 있는 시스템에서 모호성을 피하기 위해 직접 호출하는 대신 항상 -m 스위치를 통해 pip 를 실행할 수 있습니다.
문서 변경 사항¶
이 변경의 일환으로, 문서의 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 446: 새로 생성된 파일 기술자는 상속 불가능함¶
PEP 446 은 새로 생성된 파일 기술자를 non-inheritable 로 만듭니다. 일반적으로 이는 애플리케이션이 원하는 동작입니다. 새로운 프로세스를 실행할 때 현재 열려 있는 파일이 새 프로세스에서도 열려 있으면 찾기 어려운 온갖 버그와 잠재적인 보안 문제가 발생할 수 있습니다.
하지만 상속이 필요한 경우도 있습니다. 이러한 사례를 지원하기 위해 다음의 새로운 함수와 메서드가 제공됩니다:
더 보기
- PEP 446 – 새로 생성된 파일 기술자를 상속 불가능하게 설정
Victor Stinner가 작성하고 구현한 PEP.
Codec 처리 개선¶
codecs 모듈은 처음 도입될 때부터 타입에 구애받지 않는 동적 인코딩 및 디코딩 시스템으로 작동하도록 설계되었습니다. 그러나 Python 텍스트 모델, 특히 내장된 str, bytes, 그리고 bytearray 타입에서 제공하는 타입 제한이 있는 편의 메서드와의 밀접한 결합으로 인해 그 사실이 역사적으로 가려져 왔습니다.
상황을 명확히 하는 핵심 단계로, codecs.encode() 및 codecs.decode() 편의 함수가 Python 2.7, 3.3, 3.4에서 제대로 문서화되었습니다. 이 함수들은 Python 2.4부터 codecs 모듈에 존재했으며(회귀 테스트 스위트에서도 다뤄짐) 이전에는 실행 시 내부 탐색을 통해서만 확인 가능했습니다.
str, bytes, 그리고 bytearray 의 편의 메서드와 달리, codecs 편의 함수는 Python 2와 Python 3 모두에서 임의의 코덱을 지원하며, 유니코드 텍스트 인코딩(Python 3)이나 basestring <-> basestring 변환(Python 2)으로 제한되지 않습니다.
Python 3.4에서 인터프리터는 표준 라이브러리에서 제공하는 알려진 비텍스트 인코딩을 식별할 수 있으며, 적절한 경우 사용자를 이러한 범용 편의 함수로 안내합니다:
>>> b"abcdef".decode("hex")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs
>>> "hello".encode("rot13")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs
>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs
관련된 변경 사항으로, 하위 호환성을 깨뜨리지 않는 범위 내에서 가능할 때마다 인코딩 및 디코딩 작업 중에 발생하는 예외는 오류를 발생시킨 코덱의 이름을 포함하는 동일한 유형의 체인 예외로 래핑됩니다:
>>> import codecs
>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)
>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
return (bz2.compress(input), len(input))
File "/usr/lib/python3.4/bz2.py", line 498, in compress
return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)
마지막으로, 위의 예시에서 보듯이 이러한 개선을 통해 Python 3.2에서 복구된 비유니코드 코덱에 대한 편의 별칭이 다시 복원되었습니다. 이는 예를 들어 이진 데이터를 16진수 표현으로 인코딩하거나 디코딩하는 것을 다음과 같이 작성할 수 있음을 의미합니다:
>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'
표준 라이브러리에서 제공되는 바이너리 및 텍스트 변환은 바이너리 변환 및 텍스트 변환 에 상세히 설명되어 있습니다.
(Nick Coghlan이 bpo-7475, bpo-17827, bpo-17828 및 bpo-19619 에서 기여함.)
PEP 451: 임포트 시스템을 위한 ModuleSpec 타입¶
PEP 451 provides an encapsulation of the information about a module that the import machinery will use to load it (that is, a module specification). This helps simplify both the import implementation and several import-related APIs. The change is also a stepping stone for several future import-related improvements.
PEP의 공개적인 변화는 모두 하위 호환성을 유지합니다. 게다가, 임포터 작성자를 제외한 모든 사람에게 투명하게 적용됩니다. 주요 finder 및 loader 메서드는 폐지되었으나 계속 작동할 것입니다. 새로운 임포터는 PEP에 기술된 새 메서드를 사용해야 합니다. 기존 임포터는 새 메서드를 구현하도록 업데이트되어야 합니다. 교체되어야 할 메서드 목록과 그 대체본은 폐지됨 섹션을 참조하십시오.
기타 언어 변경 사항¶
핵심 파이썬 언어에 가해진 일부 작은 변경 사항은 다음과 같습니다:
Unicode 데이터베이스가 UCD 버전 6.3으로 업데이트되었습니다.
min()및max()는 이제 평가하는 이터러블에 요소가 없을 때 반환할 값을 지정하기 위해 default 키워드 전용 인수를 수락합니다. (Julian Berman이 bpo-18111 에서 기여함.)모듈 객체는 이제 weakly referenceable 합니다.
모듈
__file__속성(및 관련 값)은 스크립트가 상대 경로를 사용하여 직접 실행된 경우의__main__.__file__을 제외하고는 기본적으로 항상 절대 경로를 포함해야 합니다. (Brett Cannon이 bpo-18416 에서 기여함.)모든 UTF-* 코덱(UTF-7 제외)은
surrogatepass에러 처리기를 사용하지 않는 한 인코딩과 디코딩 모두에서 surrogate를 거부하며, 이는 유효한 surrogate 쌍을 허용하는 UTF-16 디코더와 비-BMP 문자를 인코딩할 때 이를 생성하는 UTF-16 인코더는 제외입니다. (Victor Stinner, Kang-Hao (Kenny) Lu 및 Serhiy Storchaka가 bpo-12892 에서 기여함.)새로운 German EBCDIC codec
cp273. (Michael Bierenfeld와 Andrew Kuchling이 bpo-1097797 에서 기여함.)새로운 Ukrainian codec
cp1125. (Serhiy Storchaka가 bpo-19668 에서 기여함.)bytes.join() 및bytearray.join()은 이제 인자로 임의의 버퍼 객체를 수락합니다. (Antoine Pitrou가 bpo-15958 에서 기여함.)int생성자는 이제 base 인자로__index__메서드를 가진 모든 객체를 수락합니다. (Mark Dickinson이 bpo-16772 에서 기여함.)프레임 객체는 프레임에서 로컬 변수에 대한 모든 참조를 제거하는
clear()메서드를 갖습니다. (Antoine Pitrou가 bpo-17934 에서 기여함.)memoryview는 이제Sequence로 등록되며,reversed()내장 함수를 지원합니다. (Nick Coghlan과 Claudiu Popa가 bpo-18690 및 bpo-19078 에서 기여함.)help()가 보고하는 시그니처는 Argument Clinic의 도입과inspect및pydoc모듈의 다른 변경 사항으로 인해 여러 경우에 수정되고 개선되었습니다.__length_hint__`는 이제 공식 언어 사양에 포함됩니다 (참조: :pep:`424()). (Armin Ronacher가 bpo-16148 에 기여함.)
새로운 모듈¶
asyncio¶
새로운 asyncio 모듈(PEP 3156 에 정의됨)은 파이썬을 위한 표준 플러그형 이벤트 루프 모델을 제공하여 표준 라이브러리에서 강력한 비동기 IO 지원을 제공하고, 다른 이벤트 루프 구현이 표준 라이브러리 및 서로와 상호 작용하기 쉽게 만듭니다.
Python 3.4에서 이 모듈은 provisional API 로 간주됩니다.
더 보기
- PEP 3156 – 비동기 IO 지원 재시작: “asyncio” 모듈
Guido van Rossum이 작성하고 구현을 주도한 PEP.
ensurepip¶
새로운 ensurepip 모듈은 PEP 453 구현의 핵심 기반입니다. 일반적인 상황에서 최종 사용자는 이 모듈과 상호작용할 필요가 없지만, 설치 또는 가상 환경으로 자동 부트스트랩을 거부한 경우 pip 을 수동으로 부트스트랩하는 데 사용할 수 있습니다.
ensurepip`에는 자체 버전의 ``pip` 복사본이 포함되어 있으며, 이는 배포되는 CPython의 첫 번째 릴리스 후보 시점까지 최신 상태로 유지됩니다 (이는 유지 보수 릴리스와 기능 릴리스 모두에 적용됩니다). ensurepip``은 인터넷에 접속하지 않습니다. 설치된 환경이 인터넷에 연결되어 있는 경우, ``ensurepip 실행 후 포함된 pip``을 사용하여 ``pip``을 포함된 버전보다 더 최신 버전으로 업그레이드할 수 있습니다. (이처럼 업그레이드된 ``pip 버전은 별도로 설치된 패키지로 간주되므로 Python을 제거하더라도 삭제되지 않습니다.)
이 모듈의 이름이 ensure _pip인 이유는 이미 pip 가 설치되어 있는 경우 아무것도 하지 않기 때문입니다. 또한 기존에 설치된 pip 버전이 포함된 버전보다 오래된 경우 포함된 버전을 설치하게 하는 --upgrade 옵션도 제공합니다.
enum¶
새로운 enum 모듈(PEP 435 에 정의됨)은 열거형 타입의 표준 구현을 제공하며, 다른 모듈(예: socket)이 불투명한 정수 상수를 하위 호환성이 유지되는 열거형 값으로 대체함으로써 더 유익한 오류 메시지와 더 나은 디버깅 지원을 제공할 수 있게 합니다.
더 보기
- PEP 435 – 파이썬 표준 라이브러리에 Enum 타입 추가
Barry Warsaw, Eli Bendersky 및 Ethan Furman이 작성하고 Ethan Furman이 구현한 PEP.
pathlib¶
새로운 pathlib 모듈은 다양한 운영 체제에 적합한 의미 체계를 가진 파일 시스템 경로를 나타내는 클래스를 제공합니다. 경로 클래스는 I/O 없이 순수한 계산 연산만 제공하는 순수한 경로(pure paths) 와, 순수한 경로를 상속받으면서 I/O 연산도 제공하는 구상 경로(concrete paths) 로 구분됩니다.
Python 3.4에서 이 모듈은 provisional API 로 간주됩니다.
더 보기
- PEP 428 – pathlib 모듈 – 객체 지향 파일 시스템 경로
Antoine Pitrou가 작성하고 구현한 PEP입니다.
selectors¶
새로운 selectors 모듈( PEP 3156 구현의 일부로 생성됨)은 select 모듈 프리미티브를 기반으로 하는 고수준이며 효율적인 I/O 멀티플렉싱을 허용합니다.
statistics¶
새로운 statistics 모듈( PEP 450 에서 정의됨)은 표준 라이브러리에서 핵심 통계 기능을 직접 제공합니다. 이 모듈은 데이터 시리즈의 평균, 중앙값, 최빈값, 분산 및 표준편차 계산을 지원합니다.
더 보기
- PEP 450 – 표준 라이브러리에 통계 모듈 추가
Steven D’Aprano가 작성하고 구현한 PEP입니다.
tracemalloc¶
새로운 tracemalloc 모듈( PEP 454 에서 정의됨)은 파이썬이 할당한 메모리 블록을 추적하는 디버그 도구입니다. 다음 정보를 제공합니다:
객체가 할당된 위치 추적
파일명 및 줄 번호별로 할당된 메모리 블록에 대한 통계 정보: 할당된 메모리 블록의 총 크기, 개수 및 평균 크기
두 개의 스냅샷 간 차이를 계산하여 메모리 누수 감지
더 보기
- PEP 454 – 파이썬 메모리 할당을 추적하는 새로운 tracemalloc 모듈 추가
Victor Stinner가 작성하고 구현한 PEP입니다.
개선된 모듈¶
abc¶
새로운 함수 abc.get_cache_token() 은 객체 그래프의 변경에 영향을 받는 캐시를 언제 무효화해야 하는지 파악하는 데 사용될 수 있습니다. (Łukasz Langa가 bpo-16832 에서 기여)
새로운 클래스 ABC 는 메타 클래스로 ABCMeta 를 가집니다. ABC 를 베이스 클래스로 사용하는 것은 metaclass=abc.ABCMeta 를 명시하는 것과 본질적으로 동일한 효과를 가지지만, 타이핑이 더 간단하고 읽기 쉽습니다. (Bruno Dupuis가 bpo-16049 에서 기여)
aifc¶
getparams() 메서드가 이제 일반 튜플 대신 namedtuple을 반환합니다. (Claudiu Popa가 bpo-17818 에서 기여)
aifc.open() 이 이제 컨텍스트 관리 프로토콜을 지원합니다. with 블록에서 사용될 때, 반환된 객체의 close() 메서드가 블록 끝에서 자동으로 호출됩니다. (Serhiy Storchacha가 bpo-16486 에서 기여)
writeframesraw() 및 writeframes() 메서드가 이제 모든 bytes-like object 를 수용합니다. (Serhiy Storchaka가 bpo-8311 에서 기여)
argparse¶
FileType 클래스가 이제 *encoding* 및 *errors* 인자를 수용하며, 이들은 open() 으로 전달됩니다. (Lucas Maystre가 bpo-11175 에서 기여)
audioop¶
audioop 가 이제 24비트 샘플을 지원합니다. (Serhiy Storchaka가 bpo-12866 에서 기여)
새로운 byteswap() 함수가 빅 엔디안 샘플을 리틀 엔디안으로, 그리고 그 반대로 변환합니다. (Serhiy Storchaka가 bpo-19641 에서 기여)
audioop 의 모든 함수가 이제 모든 bytes-like object 를 수용합니다. 문자열은 허용되지 않습니다. 이전에도 작동하지 않았으며, 이제는 즉시 오류를 발생시킵니다. (Serhiy Storchaka가 bpo-16685 에서 기여)
base64¶
base64 의 인코딩 및 디코딩 함수가 이전에는 bytes 또는 bytearray 인스턴스를 요구하던 경우에 이제 모든 bytes-like object 를 수용합니다. (Nick Coghlan이 bpo-17839 에서 기여)
새로운 기능인 a85encode(), a85decode(), b85encode(), 및 b85decode() 는 각각 Ascii85 와 git/mercurial의 Base85 형식과 바이너리 데이터를 인코딩 및 디코딩하는 기능을 제공합니다. a85 함수에는 Adobe 변형을 포함한 Ascii85 인코딩의 다양한 버전과 호환되도록 하는 옵션이 있습니다. (Martin Morrison, Mercurial 프로젝트, Serhiy Storchaka, 그리고 Antoine Pitrou가 bpo-17618 에서 기여)
collections¶
ChainMap.new_child() 메서드가 이제 체인에 추가할 자식 맵을 지정하는 *m* 인자를 수용합니다. 이를 통해 기존 매핑 및/또는 사용자 정의 매핑 유형을 자식으로 사용할 수 있습니다. (Vinay Sajip가 bpo-16613 에서 기여)
colorsys¶
The number of digits in the coefficients for the RGB — YIQ conversions have been expanded so that they match the FCC NTSC versions. The change in results should be less than 1% and may better match results found elsewhere. (Contributed by Brian Landers and Serhiy Storchaka in bpo-14323.)
contextlib¶
새로운 contextlib.suppress 컨텍스트 관리자는 단일 문장에서 의도적으로 예외를 억제하는 코드의 의도를 명확하게 하는 데 도움을 줍니다. (Raymond Hettinger가 bpo-15806 에서, Zero Piraeus가 bpo-19266 에서 기여)
새로운 contextlib.redirect_stdout() 컨텍스트 관리자를 사용하면 출력을 sys.stdout 에 기록하고 리디렉션 옵션을 제공하지 않는 유연하지 않은 API를 처리하는 유틸리티 스크립트 작성이 더 쉬워집니다. 이 컨텍스트 관리자를 사용하면 sys.stdout 출력을 다른 스트림이나, io.StringIO 와 함께 사용하여 문자열로 리디렉션할 수 있습니다. 후자는 예를 들어 명령줄 인터페이스를 구현하기 위해 작성된 함수의 출력을 캡처하는 데 특히 유용합니다. 이는 sys.stdout 의 전역 상태에 영향을 미치기 때문에 유틸리티 스크립트에서만 사용하도록 권장됩니다. (Raymond Hettinger가 bpo-15805 에서 기여)
contextlib 문서에 일회용, 재사용 가능 및 재진입 가능 컨텍스트 관리자 간의 차이점에 대한 논의 가 포함되도록 업데이트되었습니다.
dbm¶
dbm.open() 객체가 이제 컨텍스트 관리 프로토콜을 지원합니다. with 문에서 사용될 때, 데이터베이스 객체의 close 메서드가 블록 끝에서 자동으로 호출됩니다. (Claudiu Popa 및 Nick Coghlan이 bpo-19282 에서 기여)
dis¶
show_code(), dis(), distb(), 및 disassemble() 함수가 이제 출력을 기록할 위치를 제어하는 키워드 전용 file 인자를 수용합니다.
dis 모듈이 이제 개별 바이트 코드 연산의 세부 사항에 객체 지향적 접근을 제공하는 Instruction 클래스를 중심으로 구축되었습니다.
A new method, get_instructions(), provides an iterator that emits
the Instruction stream for a given piece of Python code. Thus it is now
possible to write a program that inspects and manipulates a bytecode
object in ways different from those provided by the dis module
itself. For example:
>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
... print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE
dis 모듈의 다양한 표시 도구들이 이러한 새로운 구성 요소들을 사용하도록 다시 작성되었습니다.
또한, 새로운 애플리케이션 친화적 클래스인 Bytecode 가 인간이 읽을 수 있는 형태와 명령어를 순회하는 방식 모두로 바이트 코드를 검사할 수 있는 객체 지향 API를 제공합니다. Bytecode 생성자는 get_instructions() 와 동일한 인자(및 선택적 current_offset)를 받으며, 결과 객체를 순회하여 Instruction 객체들을 생성할 수 있습니다. 또한 이 클래스는 생성자 인수에 대해 dis 를 호출하는 것과 동등하지만 결과를 여러 줄의 문자열로 반환하는 dis 메서드를 포함합니다:
>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
... print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()
[' 1 0 LOAD_FAST 0 (x)',
' --> 3 LOAD_CONST 1 (1)',
' 6 BINARY_ADD',
' 7 RETURN_VALUE']
Bytecode 는 또한 트레이스백을 조작할 수 있는 클래스 메서드 from_traceback() 을 제공합니다 (즉, print(Bytecode.from_traceback(tb).dis()) 은 distb(tb) 와 동등합니다).
(Nick Coghlan, Ryan Kelly 및 Thomas Kluyver가 bpo-11816 에서, Claudiu Popa가 bpo-17916 에서 기여)
새로운 함수 stack_effect() 는 다른 방식으로는 확인할 수 없는 특정 연산 코드와 인수가 파이썬 스택에 미치는 영향을 계산합니다. (Larry Hastings가 bpo-19722 에서 기여)
doctest¶
새로운 옵션 플래그 인 FAIL_FAST 는 첫 번째 실패가 감지되는 즉시 테스트 실행을 중단합니다. (R. David Murray 및 Daniel Urban이 bpo-16522 에서 기여)
doctest 명령 줄 인터페이스가 이제 argparse 를 사용하며, -o 및 -f 라는 두 개의 새로운 옵션을 가집니다. -o 는 명령 줄에서 doctest 옵션 을 지정할 수 있게 하며, -f 는 -o FAIL_FAST 의 약어입니다(이는 unittest CLI에서 지원되는 유사한 옵션과 대응됩니다). (R. David Murray가 bpo-11390 에서 기여)
doctest 가 이제 확장 모듈의 __doc__ 문자열에서 독스트리(doctests)를 찾습니다. (Zachary Ware가 bpo-3158 에서 기여)
email¶
as_string() 이 이제 메시지의 문자열 표현을 생성할 때 기본 정책을 덮어쓰는 policy 인자를 수용합니다. 이는 이제 as_string 을 더 많은 상황에서 사용할 수 있음을 의미하며, 이전처럼 포맷팅 파라미터를 전달하기 위해 generator 를 만들어 사용해야 할 필요가 없습니다. (R. David Murray가 bpo-18600 에서 기여)
New method as_bytes() added to produce a bytes
representation of the message in a fashion similar to how as_string
produces a string representation. It does not accept the maxheaderlen
argument, but does accept the unixfrom and policy arguments. The
Message __bytes__() method
calls it, meaning that bytes(mymsg) will now produce the intuitive
result: a bytes object containing the fully formatted message. (Contributed
by R. David Murray in bpo-18600.)
Message.set_param() 메시지가 이제 replace 키워드 인자를 수용합니다. 이 인자가 지정되면 관련된 헤더가 위치 변경 없이 업데이트됩니다. 하위 호환성을 위해 기본값은 False 입니다. (R. David Murray가 bpo-18891 에서 기여)
새로운 서브클래스 쌍인 EmailMessage 와 MIMEPart 가 Message 에 추가되었으며, 새로운 서브모듈인 contentmanager 와 새로운 policy 속성인 content_manager 도 함께 추가되었습니다. 모든 문서는 현재 email의 새로운 provisional API 의 일부로 추가되는 새 모듈에 포함되어 있습니다. 이 클래스들은 이메일 메시지에서 콘텐츠를 추출하고 삽입하는 것을 훨씬 더 쉽게 만들어주는 여러 새로운 메서드를 제공합니다. 자세한 내용은 contentmanager 문서와 email: 예제 를 참조하십시오. 이러한 API 추가로 email6 프로젝트의 일환으로 계획되었던 작업의 대부분이 완료되었습니다. 현재 임시(provisional) 상태인 이 API는 Python 3.5에서 최종 확정될 예정입니다 (오류 처리 영역에 몇 가지 사소한 추가 사항이 포함될 수 있습니다). (R. David Murray가 bpo-18891 에서 기여)
filecmp¶
새로운 clear_cache() 함수는 마지막 비교 이후 파일이 변경되었는지 판단하기 위해 os.stat() 정보를 사용하는 filecmp 비교 캐시를 삭제하는 기능을 제공합니다. 예를 들어, 특정 파일 시스템의 파일 수정 시간 필드 해상도보다 짧은 시간 내에 파일이 변경되고 다시 확인될 가능성이 있는 경우에 사용할 수 있습니다. (Mark Levitt가 bpo-18149 에서 기여)
새로운 모듈 속성 DEFAULT_IGNORES 는 dircmp() 함수의 ignore 매개변수에 대한 기본값으로 사용되는 디렉터리 목록을 제공합니다. (Eli Bendersky가 bpo-15442 에서 기여)
functools¶
새로운 partialmethod() 디스크립터는 partial() 이 일반 호출 가능(callable) 객체에 제공하는 것과 마찬가지로, 디스크립터에 부분 인자 적용을 지원합니다. 또한 이 새로운 디스크립터는 임의의 호출 가능 객체( partial() 인스턴스 포함)가 클래스 정의에 포함될 때 일반 인스턴스 메서드처럼 동작하게 하는 것을 더 용이하게 합니다. (Alon Horev와 Nick Coghlan이 bpo-4331 에서 기여)
새로운 @~functools.singledispatch 데코레이터는 Python 표준 라이브러리에 싱글 디스패치 제네릭 함수 지원을 추가합니다. 객체 지향 프로그래밍이 공통된 데이터 세트에 대한 여러 작업을 클래스로 그룹화하는 데 중점을 두는 반면, 제네릭 함수는 다양한 종류의 데이터와 함께 작동할 수 있도록 하는 한 가지 작업의 여러 구현을 그룹화하는 데 중점을 둡니다.
더 보기
- PEP 443 – 싱글 디스패치 제네릭 함수
Łukasz Langa가 작성하고 구현한 PEP입니다.
@~functools.total_ordering 이 이제 기본 비교 함수로부터의 NotImplemented 반환 값을 지원합니다. (Katie Miller가 bpo-10042 에서 기여)
partial() 함수의 순수 파이썬 버전이 이제 표준 라이브러리에 포함되었습니다. CPython에서는 C로 가속된 버전에 의해 오버라이드되지만, 다른 구현체에서 사용할 수 있습니다. (Brian Thorne가 bpo-12428 에서 기여)
gc¶
새로운 함수 get_stats() 는 인터프리터 시작 이후의 수거 통계를 포함하는 세 개의 세대별 딕셔너리 리스트를 반환합니다. (Antoine Pitrou가 bpo-16351 에서 기여)
glob¶
새로운 함수 escape() 는 파일 이름의 특수 문자를 이스케이프하여, 글로빙 확장 과정에서 포함되지 않고 문자 그대로 매칭되도록 하는 방법을 제공합니다. (Serhiy Storchaka가 bpo-8402 에서 기여)
hashlib¶
새로운 hashlib.pbkdf2_hmac() 함수는 PKCS#5 암호 기반 키 파생 함수 2 <https://en.wikipedia.org/wiki/PBKDF2> 를 제공합니다. (Christian Heimes가 bpo-18582 에서 기여)
hashlib 해시 객체의 name 속성이 이제 공식적으로 지원되는 인터페이스입니다. 이 속성은 CPython의 hashlib 에 항상 존재해 왔지만(모든 지원되는 해시에서 소문자 이름을 반환하지는 않았음), 공개 인터페이스가 아니었기 때문에 다른 파이썬 구현체에서는 이전까지 지원되지 않았습니다. (Jason R. Coombs가 bpo-18532 에서 기여)
hmac¶
hmac 는 이제 new() 함수의 key 인자로 bytes 뿐만 아니라 bytearray 도 허용하며, new() 함수와 update() 메서드의 msg 매개변수는 이제 hashlib 모듈에서 지원하는 모든 타입을 허용합니다. (Jonas Borgström이 bpo-18240 에서 기여)
hmac.new() 함수의 digestmod 인자는 이제 hashlib 에서 인식되는 모든 해시 다이제스트 이름을 사용할 수 있습니다. 또한, digestmod 의 기본값이 MD5 인 현재 동작은 폐지되었으며, 향후 파이썬 버전에서는 기본값이 제공되지 않습니다. (Christian Heimes가 bpo-17276 에서 기여)
block_size 와 name 속성이 추가되고(digest_size 속성에 대한 공식 문서화 포함), hmac 모듈은 이제 PEP 247 API를 완전히 준수합니다. (Christian Heimes가 bpo-18775 에서 기여)
html¶
새로운 unescape() 함수는 HTML5 문자 참조를 해당 유니코드 문자로 변환합니다. (Ezio Melotti가 bpo-2927 에서 기여)
HTMLParser 는 새로운 키워드 인자 convert_charrefs 를 받으며, 이 값이 True 일 때 모든 문자 참조를 자동으로 변환합니다. 하위 호환성을 위해 기본값은 False 이지만, 향후 파이썬 버전에서 True 로 변경될 예정이므로 이 기능을 사용하려면 명시적으로 설정하고 코드를 업데이트할 것을 권장합니다. (Ezio Melotti가 bpo-13633 에서 기여)
HTMLParser 의 strict 인자가 이제 폐지되었습니다. (Ezio Melotti가 bpo-15114 에서 기여)
http¶
send_error() 는 이제 선택적 인자 explain 을 받아, 기본값이 있는 경우 이를 덮어쓰고 확장된 에러 설명을 제공할 수 있습니다. 이 확장된 에러 설명은 error_message_format 속성을 사용하여 포맷팅되어 에러 응답의 본문으로 전송됩니다. (Karl Cow가 bpo-12921 에서 기여)
http.server 의 command line interface 에 서버가 특정 주소에서 대기하도록 하는 -b/--bind 옵션이 추가되었습니다. (Malte Swart가 bpo-17764 에서 기여)
idlelib 및 IDLE¶
idlelib는 IDLE 셸과 편집기를 구현하며 다른 프로그램에서 임포트할 용도가 아니므로, 매 릴리스마다 개선사항이 반영됩니다. 3.3.0 이후의 누적 변경 사항 및 향후 3.4.x 릴리스에서 이루어지는 변경 사항은 Lib/idlelib/NEWS.txt`를 참조하십시오. 이 파일은 IDLE의 :menuselection:`Help --> About IDLE 대화 상자에서도 확인할 수 있습니다.
importlib¶
InspectLoader ABC는 소스 데이터와 경로를 받아 코드 객체를 반환하는 새로운 메서드인 source_to_code() 를 정의합니다. 기본 구현은 compile(data, path, 'exec', dont_inherit=True) 와 동일합니다. (Eric Snow 및 Brett Cannon이 bpo-15627 에서 기여)
InspectLoader 는 이제 get_code() 메서드에 대한 기본 구현을 제공합니다. 그러나 성능상의 이유로 일반적으로 해당 기본 구현을 오버라이드하는 것이 권장됩니다. (Brett Cannon이 bpo-18072 에서 기여)
imp 모듈의 폐지의 일환으로, reload() 함수가 imp 에서 importlib 로 이동되었습니다. (Berker Peksag가 bpo-18193 에서 기여)
importlib.util 에 바이트코드 버전 번호에 접근할 수 있는 MAGIC_NUMBER 속성이 추가되었습니다. 이는 폐지된 imp 모듈의 get_magic() 함수를 대체합니다. (Brett Cannon이 bpo-18192 에서 기여)
새로운 importlib.util 함수인 cache_from_source() 및 source_from_cache() 가 폐지된 imp 모듈의 동일한 이름의 함수들을 대체합니다. (Brett Cannon이 bpo-18194 에서 기여)
importlib 부트스트랩인 NamespaceLoader 가 이제 InspectLoader ABC를 준수하므로, runpy 와 python -m 을 네임스페이스 패키지와 함께 사용할 수 있습니다. (Brett Cannon이 bpo-18058 에서 기여)
importlib.util 에 유니버설 줄 바꿈 처리를 사용하여 바이트로부터 소스를 디코딩하는 새로운 함수 decode_source() 가 추가되었습니다. 이는 InspectLoader.get_source() 메서드를 구현할 때 유용합니다.
importlib.machinery.ExtensionFileLoader 에 get_filename() 메서드가 추가되었습니다. 이 메서드는 원래 구현에서 실수로 누락된 것이었습니다. (Eric Snow가 bpo-19152 에서 기여)
inspect¶
inspect 모듈이 이제 모듈, 클래스 및 함수의 소스 코드와 기타 정보를 빠르게 표시하는 기본적인 command line interface 를 제공합니다. (Claudiu Popa 및 Nick Coghlan이 bpo-18626 에서 기여)
unwrap() 은 @functools.wraps (및 래퍼 함수에 __wrapped__ 속성을 설정하는 기타 모든 API)에 의해 생성된 래퍼 함수 체인을 쉽게 풀어낼 수 있게 해줍니다. (Daniel Urban, Aaron Iles 및 Nick Coghlan이 bpo-13266 에서 기여)
새로운 enum 모듈 구현의 일환으로, inspect 모듈이 커스텀 __dir__ 메서드 및 메타클래스를 통해 제공되는 동적 클래스 속성을 훨씬 더 잘 지원하게 되었습니다. (Ethan Furman가 bpo-18929, bpo-19030 에서 기여)
getfullargspec() 와 getargspec() 이 이제 signature() API를 사용합니다. 이를 통해 __signature__ 속성을 가진 객체, argument clinic에 의해 제공되는 메타데이터를 포함한 객체, functools.partial() 객체 등 훨씬 더 넓은 범위의 호출 가능(callable) 객체를 지원할 수 있습니다. 참고로, signature() 와 달리 이 함수들은 여전히 __wrapped__ 속성을 무시하고 바인딩된 메서드에 대해 이미 바인딩된 첫 번째 인수를 보고하므로, 해당 기능이 필요한 경우 코드를 수정하여 직접 signature() 를 사용해야 합니다. (Yury Selivanov가 bpo-17481 에서 기여)
signature() 가 이제 CPython 함수의 덕 타입을 지원하여 Cython으로 컴파일된 함수에 대한 지원이 추가되었습니다. (Stefan Behnel 및 Yury Selivanov가 bpo-17159 에서 기여)
ipaddress¶
ipaddress 는 Python 3.3에서 provisional API 로 표준 라이브러리에 추가되었습니다. Python 3.4 출시와 함께 이 조건이 제거되었으며, ipaddress 는 이제 하위 호환성 유지를 위한 일반적인 표준 라이브러리 요구 사항을 따르는 안정적인 API로 간주됩니다.
새로운 is_global 속성은 주소가 전역적으로 라우팅 가능할 경우 True 를 반환합니다. (Peter Moody가 bpo-17400 에서 기여)
logging¶
TimedRotatingFileHandler 에 롤오버가 발생해야 하는 시간대를 지정하는 데 사용할 수 있는 새로운 atTime 매개변수가 추가되었습니다. (Ronald Oussoren이 bpo-9556 에서 기여)
SocketHandler 와 DatagramHandler 가 이제 Unix 도메인 소켓을 지원합니다 (port 를 None 으로 설정하여 사용 가능). (Vinay Sajip이 commit ce46195b56a9에서 기여)
fileConfig() 가 이제 fname 매개변수로 configparser.RawConfigParser 의 서브클래스 인스턴스를 수용합니다. 이는 로깅 설정이 전체 애플리케이션 설정의 일부인 경우나, 애플리케이션이 fileConfig() 에 전달하기 전에 설정을 수정하는 경우에 구성 파일을 사용하는 것을 용이하게 합니다. (Vinay Sajip가 bpo-16110 에서 기여)
logging.config.listen() 함수를 통해 소켓으로부터 수신된 로깅 구성 데이터를 처리하기 전에, 새로운 verify 키워드 인수에 검증 함수를 전달하여 확인하는 기능이 추가되었습니다. (Vinay Sajip가 bpo-15452 에서 기여)
marshal¶
기본 marshal 버전이 3으로 업데이트되었습니다. 새 버전을 구현하는 코드는 인터니스 문자열의 단일 복사본만 기록하고 역직렬화 시에도 이를 유지하는 Python2 방식을 복구하며, 이 “단일 복사” 기능을 모든 객체 유형(재귀적 참조 처리 포함)으로 확장합니다. 이를 통해 .pyc 파일의 크기와 .pyc (또는 .pyo) 파일로부터 로드될 때 모듈이 점유하는 메모리 양이 모두 줄어듭니다. (Kristján Valur Jónsson이 bpo-16475 에서 기여했으며, Antoine Pitrou가 bpo-19219 에서 추가 성능 향상을 제공했습니다.)
mmap¶
mmap 객체는 이제 weakly referenceable 합니다. (Valerie Lambert가 bpo-4885 에서 기여했습니다.)
multiprocessing¶
Unix 환경에서 multiprocessing 을 사용하여 프로세스를 시작하기 위한 두 개의 새로운 start methods, spawn 및 forkserver 가 추가되었습니다. 이들은 프로세스와 스레드의 혼합을 더 견고하게 만들며, spawn 메서드는 Windows에서 multiprocessing이 항상 사용해 온 의미론과 일치합니다. 새로운 함수 get_all_start_methods() 는 플랫폼에서 사용 가능한 모든 시작 방법을 보고하고, get_start_method() 는 현재 시작 방법을 보고하며, set_start_method() 는 시작 방법을 설정합니다. (Richard Oudkerk가 bpo-8713 에서 기여했습니다.)
multiprocessing 은 이제 자식 프로세스가 생성되는 방식을 결정하는 context 개념을 포함합니다. 새로운 함수 get_context() 는 지정된 시작 방법을 사용하는 컨텍스트를 반환합니다. 이는 multiprocessing 모듈 자체와 동일한 API를 가지므로, 해당 컨텍스트 내에서 작동할 Pool 및 기타 객체를 생성하는 데 사용할 수 있습니다. 이를 통해 프레임워크와 애플리케이션 또는 동일한 애플리케이션의 서로 다른 부분이 서로 방해하지 않고 multiprocessing을 사용할 수 있습니다. (Richard Oudkerk가 bpo-18999 에서 기여했습니다.)
과거 fork 시작 방법을 사용하는 경우를 제외하고, 자식 프로세스가 더 이상 부모로부터 불필요한 핸들/파일 기술자를 상속받지 않습니다 (bpo-8713 의 일부).
multiprocessing 은 이제 spawn 또는 forkserver 시작 방법을 사용할 때 자식 프로세스에서 __main__ 을 적절하게 초기화하기 위해 runpy (-m 옵션을 구현)에 의존합니다. 이는 multiprocessing, -m 명령줄 옵션, 그리고 명시적인 상대 임포트를 결합할 때 자식 프로세스에서 발생할 수 있는 몇 가지 모호한 오류 사례를 해결합니다. (Nick Coghlan이 bpo-19946 에서 기여했습니다.)
연산자¶
새로운 함수 length_hint() 는 이 기능의 공식 명세인 PEP 424 의 일부로, __length_hint__() 특수 메서드가 어떻게 사용되어야 하는지에 대한 규격을 구현합니다. (Armin Ronacher가 bpo-16148 에서 기여했습니다.)
이제 참조용 및 Python의 다른 구현체에서 사용할 수 있는 순수 파이썬 버전의 operator 모듈이 제공됩니다. (Zachary Ware가 bpo-16694 에서 기여했습니다.)
os¶
파일 기술자의 inheritable flag (os.get_inheritable(), os.set_inheritable()) 또는 Windows 핸들(os.get_handle_inheritable(), os.set_handle_inheritable())을 가져오고 설정하는 새로운 함수들이 추가되었습니다.
새로운 함수 cpu_count() 는 Python이 실행되는 플랫폼에서 사용 가능한 CPU 수를 보고하며, 개수를 파악할 수 없는 경우 None 을 반환합니다. (multiprocessing.cpu_count() 함수는 이제 이 함수를 기반으로 구현됩니다.) (Trent Nelson, Yogesh Chaudhari, Victor Stinner, 그리고 Charles-François Natali가 bpo-17914 에서 기여했습니다.)
os.path.samestat() 을 Windows 플랫폼에서도 사용할 수 있으며, (os.path.samefile() 구현은 이제 Unix와 Windows 간에 공유됩니다.) (Brian Curtin이 bpo-11939 에서 기여했습니다.)
os.path.ismount() 이 이제 Windows에서 드라이브 루트 아래에 마운트된 볼륨을 인식합니다. (Tim Golden이 bpo-9035 에서 기여했습니다.)
os.open() supports two new flags on platforms that provide them,
O_PATH (un-opened file descriptor), and O_TMPFILE
(unnamed temporary file; as of 3.4.0 release available only on Linux systems
with a kernel version of 3.11 or newer that have uapi headers). (Contributed
by Christian Heimes in bpo-18673 and Benjamin Peterson, respectively.)
pdb¶
pdb 가 제너레이터, yield, 그리고 yield from 을 더 유용한 방식으로 처리할 수 있도록 강화되었습니다. 이는 특히 asyncio 기반 프로그램의 디버깅에 도움이 됩니다. (Andrew Svetlov와 Xavier de Gaye가 bpo-16596 에서 기여했습니다.)
The print command has been removed from pdb, restoring access to the
Python print() function from the pdb command line. Python2’s pdb did
not have a print command; instead, entering print executed the
print statement. In Python3 print was mistakenly made an alias for the
pdb p command. p, however, prints the repr of its argument,
not the str like the Python2 print command did. Worse, the Python3
pdb print command shadowed the Python3 print function, making it
inaccessible at the pdb prompt. (Contributed by Connor Osborn in
bpo-18764.)
pickle¶
pickle 은 이제 새로운 피클 프로토콜인 프로토콜 4를 지원합니다(기본으로 사용되지는 않음). 이 새로운 프로토콜은 중첩된 클래스, 매우 긴 문자열 및 컨테이너, 그리고 __new__() 메서드가 키워드 전용 인수를 받는 클래스와 같은 이전 프로토콜에서 발생하던 여러 문제를 해결합니다. 또한 몇 가지 효율성 개선 사항도 포함되어 있습니다.
더 보기
- PEP 3154 – Pickle protocol 4
Antoine Pitrou가 작성하고 Alexandre Vassalotti가 구현한 PEP입니다.
plistlib¶
plistlib 은 이제 새로운 load(), dump(), loads(), 및 dumps() 함수를 포함하여 표준 라이브러리 직렬화 프로토콜과 유사한 API를 제공합니다. (이전 API는 이제 폐지되었습니다.) 이미 지원되는 XML plist 형식(FMT_XML) 외에도 이제 바이너리 plist 형식(FMT_BINARY)도 지원합니다. (Ronald Oussoren 등이 bpo-14455 에서 기여했습니다.)
poplib¶
poplib 에 두 개의 새로운 메서드가 추가되었습니다: POP 서버가 광고하는 기능 목록을 반환하는 capa(), 그리고 POP 서버가 지원하는 경우 명시적 텍스트로 된 POP3 세션을 암호화된 POP3 세션으로 전환하는 stls(). (Lorenzo Catucci가 bpo-4473 에서 기여했습니다.)
pprint¶
pprint 모듈의 PrettyPrinter 클래스와 그 관련 함수인 pformat(), 및 pprint() 에 출력을 구성하는 새로운 옵션인 compact 가 추가되었습니다. 현재 compact 를 True 로 설정하면, 각 (들여쓰기 된) 줄에 width 내에 들어갈 수 있는 만큼의 시퀀스 요소들이 출력됩니다. (Serhiy Storchaka가 bpo-19132 에서 기여했습니다.)
긴 문자열은 이제 파이썬의 일반적인 줄 바꿈 구문을 사용하여 처리됩니다. (Antoine Pitrou가 bpo-17150 에서 기여했습니다.)
pty¶
pty.spawn() 은 이제 None 대신 자식 프로세스에 대한 os.waitpid() 의 상태 값을 반환합니다. (Gregory P. Smith가 기여했습니다.)
pydoc¶
pydoc 모듈은 이제 inspect.signature() 내성 API를 직접 기반으로 하므로, 훨씬 더 다양한 호출 가능 객체에 대한 시그니처 정보를 제공할 수 있습니다. 이 변경 사항은 또한 도움말 정보를 표시할 때 __wrapped__ 속성이 고려됨을 의미합니다. (Larry Hastings가 bpo-19674 에서 기여했습니다.)
pydoc 모듈은 이제 이미 바인딩된 메서드에 대해 self 매개변수를 표시하지 않습니다. 대신, 제공된 호출 가능 객체의 정확한 현재 시그니처를 항상 표시하도록 합니다. (Larry Hastings가 bpo-20710 에서 기여했습니다.)
pydoc`에 직접 이루어진 변경 사항 외에도, 사용자 정의 ``__dir__` 메서드 및 다양한 디스크립터 동작 처리가 기반이 되는 inspect 모듈의 변화로 인해 크게 개선되었습니다.
내장 기능인 help() 는 pydoc 을 기반으로 하므로, 위의 변경 사항은 help() 의 동작에도 영향을 미칩니다.
re¶
새로운 fullmatch() 함수와 Pattern.fullmatch() 메서드는 일치시키기 위해 문자열의 양 끝에 패턴을 고정합니다. 이는 일치의 목적을 명시적으로 밝힐 수 있는 방법을 제공하며, 코드 변경이나 기존 정규 표현식에 대안이 추가될 때 $ 문자가 소실되어 발생하는 일종의 미세한 오류들을 방지합니다. (Matthew Barnett이 bpo-16203 에서 기여했습니다.)
regex objects 의 repr에는 이제 패턴과 플래그가 포함되며, match objects 의 repr에는 시작 위치, 끝 위치 및 일치한 부분 문자열이 포함됩니다. (Hugo Lopes Tavares와 Serhiy Storchaka가 bpo-13592 및 bpo-17087 에서 기여했습니다.)
resource¶
리눅스 플랫폼(커널 버전 2.6.36 이상 및 glibc 2.13 이상)에서 사용 가능한 새로운 prlimit() 함수는 호출한 것 이외의 프로세스에 대한 리소스 제한을 조회하거나 설정할 수 있는 기능을 제공합니다. (Christian Heimes가 bpo-16595 에서 기여했습니다.)
리눅스 커널 버전 2.6.36 이상에서는 다음과 같은 몇 가지 새로운 리눅스 전용 상수가 추가되었습니다: RLIMIT_MSGQUEUE, RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIME, 그리고 RLIMIT_SIGPENDING. (Christian Heimes가 bpo-19324 에서 기여했습니다.)
FreeBSD 버전 9 이상에서는 다음과 같은 몇 가지 새로운 FreeBSD 전용 상수가 추가되었습니다: RLIMIT_SBSIZE, RLIMIT_SWAP, 그리고 RLIMIT_NPTS. (Claudiu Popa가 bpo-19343 에서 기여했습니다.)
select¶
epoll 객체는 이제 컨텍스트 관리 프로토콜을 지원합니다. with 문에서 사용될 때, 블록이 끝날 때 close() 메서드가 자동으로 호출됩니다. (Serhiy Storchaka가 bpo-16488 에서 기여했습니다.)
devpoll objects now have fileno() and
close() methods, as well as a new attribute
closed. (Contributed by Victor Stinner in
bpo-18794.)
shelve¶
Shelf 인스턴스를 이제 with 문에서 사용할 수 있으며, with 블록이 끝날 때 자동으로 닫힙니다. (Filip Gruszczyński가 bpo-13896 에서 기여했습니다.)
shutil¶
copyfile() 은 소스와 대상이 동일한 파일인 경우 특정 Error 하위 클래스인 SameFileError 를 발생시키며, 이를 통해 애플리케이션에서 이 특정 오류에 대한 적절한 조치를 취할 수 있습니다. (Atsuo Ishimoto와 Hynek Schlawack가 bpo-1492704 에서 기여했습니다.)
smtpd¶
The SMTPServer and SMTPChannel classes now
accept a map keyword argument which, if specified, is passed in to
asynchat.async_chat as its map argument. This allows an application
to avoid affecting the global socket map. (Contributed by Vinay Sajip in
bpo-11959.)
smtplib¶
SMTPException 이 이제 OSError 의 서브 클래스가 되어, 오류 발생 여부만 확인하는 코드에서 소켓 수준의 오류와 SMTP 프로토콜 수준의 오류를 하나의 try/except 문으로 모두 잡을 수 있습니다. (Contributed by Ned Jackson Lovely in bpo-2118.)
socket¶
socket 모듈은 이제 이를 지원하는 플랫폼에서 CAN_BCM 프로토콜을 지원합니다. (Contributed by Brian Thorne in bpo-15359.)
소켓 객체는 상속 가능 여부를 설정하거나 확인하는 새로운 메서드인 get_inheritable() 및 set_inheritable() 을 제공하며, 이를 통해 상속 가능한 플래그 를 처리할 수 있습니다.
socket.AF_* 및 socket.SOCK_* 상수는 이제 새로운 enum 모듈을 사용하는 열거형 값입니다. 이를 통해 디버깅 시 정수 형태의 “매직 넘버” 대신 의미 있는 이름이 출력됩니다.
AF_LINK 상수를 이제 BSD 및 OSX에서 사용할 수 있습니다.
inet_pton() 및 (Contributed by Atsuo Ishimoto in :issue:`7171().)
sqlite3¶
connect() 함수에 새롭게 추가된 불리언 매개 변수 uri 를 사용하여 database 매개 변수가 uri 임을 나타낼 수 있습니다 (참조: SQLite URI 문서). (Contributed by poq in bpo-13773.)
ssl¶
PROTOCOL_TLSv1_1 및 PROTOCOL_TLSv1_2 (TLSv1.1 및 TLSv1.2 지원)가 추가되었습니다. 이 프로토콜들은 Python이 OpenSSL 1.0.1 이상과 연결된 경우에만 사용할 수 있습니다. (Contributed by Michele Orrù and Antoine Pitrou in bpo-16692.)
새로운 함수 create_default_context() 는 호환성과 보안 사이의 적절한 균형을 갖춘 설정을 가진 SSLContext 를 가져오는 표준화된 방법을 제공합니다. 이 설정은 SSLContext 생성자가 제공하는 기본값보다 더 엄격하며, 향후 모범 사례에 따른 보안 요구사항이 변경될 경우 사전 예고 없이 조정될 수 있습니다. SSL을 지원하는 표준 라이브러리를 사용할 때 권장되는 새로운 모범 사례는 create_default_context() 를 사용하여 SSLContext 객체를 생성하고, 필요한 경우 수정한 후 관련 표준 API의 context 인자로 전달하는 것입니다. (Contributed by Christian Heimes in bpo-19689.)
SSLContext 메서드 (Contributed by Christian Heimes in :issue:`18138().)
새 함수 get_default_verify_paths() 는 set_default_verify_paths() 메서드가 OpenSSL의 기본 cafile 및 capath 를 설정하는 데 사용하는 경로와 환경 변수의 네임드 튜플을 반환합니다. 이는 기본 검증 문제를 디버깅할 때 도움이 될 수 있습니다. (Contributed by Christian Heimes in bpo-18143.)
SSLContext 에 새로운 메서드인 cert_store_stats() 가 추가되어 로드된 X.509 인증서, X.509 CA 인증서 및 인증서 해지 목록(crl s)의 수를 보고하며, 또한 로드된 CA 인증서 목록을 반환하는 get_ca_certs() 메서드가 추가되었습니다. (Contributed by Christian Heimes in bpo-18147.)
OpenSSL 0.9.8 이상을 사용할 수 있는 경우, SSLContext 에 새로운 어트리뷰트 verify_flags 가 추가되었습니다. 이를 새 상수인 VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN, 또는 VERIFY_X509_STRICT 의 조합으로 설정하여 인증서 검증 프로세스를 제어할 수 있습니다. 기본적으로 OpenSSL은 CRL 검증을 수행하지 않습니다. (Contributed by Christien Heimes in bpo-8813.)
새로운 SSLContext 메서드인 이 메서드는 클라이언트가 서버를 검증할 때 사용하는 TLS 웹 서버 인증 인증서(``purpose=`()SERVER_AUTH)와 서버가 클라이언트 인증서를 검증할 때 사용하는 인증서(purpose=CLIENT_AUTH)를 모두 로드하는 데 사용될 수 있습니다. (Contributed by Christian Heimes in bpo-19292.)
윈도우 전용인 두 개의 새 함수 enum_certificates() 및 (Contributed by Christian Heimes in :issue:`17134().)
새로운 ssl.SSLContext.set_servername_callback() 메서드를 사용하여 서버 측 SNI(Server Name Indication)를 지원합니다. (Contributed by Daniel Black in bpo-8109.)
SSLSocket.getpeercert`가 반환하는 딕셔너리에 추가적인 ``X509v3`() 확장 항목인 crlDistributionPoints, calIssuers 및 OCSP URI가 포함됩니다. (Contributed by Christian Heimes in bpo-18379.)
통계¶
stat 모듈은 이제 _stat`의 C 구현을 기반으로 합니다. 대부분의 값이 표준화되어 있지 않고 플랫폼에 따라 다르기 때문에 C 구현이 필요합니다. (Contributed by Christian Heimes in :issue:`11016.)
이 모듈은 새로운 ST_MODE 플래그, S_IFDOOR, S_IFPORT 및 (Contributed by Christian Hiemes in :issue:`11016.)
구조체¶
새 함수 iter_unpack 및 컴파일된 형식의 새로운 struct.Struct.iter_unpack() 메서드는 특정 데이터 형식이 반복되는 버퍼를 스트림 방식으로 언팩합니다. (Contributed by Antoine Pitrou in bpo-17804.)
서브프로세스¶
check_output`은 이제 실행될 명령의 ``stdin`() 내용을 제공하는 데 사용할 수 있는 input 인자를 받습니다. (Contributed by Zack Weinberg in bpo-16624.)
getoutput() 및 (Contributed by Tim Golden in :issue:`10197().)
sunau¶
getparams() 메서드는 이제 일반 튜플 대신 네임드 튜플을 반환합니다. (Contributed by Claudiu Popa in bpo-18901.)
sunau.open() 은 이제 컨텍스트 관리 프로토콜을 지원합니다. with 블록 내에서 사용될 때, 반환된 객체의 close 메서드가 블록이 끝날 때 자동으로 호출됩니다. (Contributed by Serhiy Storchaka in bpo-18878.)
AU_write.setsampwidth`가 이제 24비트 샘플을 지원하여, 해당 모듈을 사용하여 24샘플을 쓰는 기능을 추가했습니다. (Contributed by Serhiy Storchaka in :issue:`19261().)
writeframesraw() 및 writeframes() 메서드가 이제 모든 bytes-like object 를 수용합니다. (Serhiy Storchaka가 bpo-8311 에서 기여)
sys 모듈¶
새 함수 sys.getallocatedblocks`는 인터프리터에 의해 할당된 현재 블록 수를 반환합니다. (기본 `()–with-pymalloc`` 설정의 CPython에서, 이는 PyObject_Malloc() API를 통해 이루어진 할당입니다.) 이는 특히 테스트 스위트를 통해 자동화할 경우 메모리 누수를 추적하는 데 유용할 수 있습니다. (Contributed by Antoine Pitrou in bpo-13390.)
Python 인터프리터가 대화형 모드 로 시작될 때, sys 모듈에 __interactivehook__ 어트리뷰트가 있는지 확인합니다. 해당 어트리뷰스가 존재하면 대화형 모드가 시작되기 직전에 인자 없이 그 값이 호출됩니다. 이 확인은 PYTHONSTARTUP 파일을 읽은 후에 수행되므로, 해당 파일에서 설정할 수 있습니다. site 모듈은 플랫폼이 readline 을 지원하는 경우 탭 완성 및 히스토리 저장(파일: ~/.python-history)을 활성화하는 함수로 이를 설정합니다. 이 (새로운) 동작을 원하지 않는 경우, sys 에서 해당 어트리뷰트를 삭제하거나 다른 호출 가능한 것으로 설정하여 PYTHONSTARTUP, sitecustomize 또는 usercustomize 에서 재정의할 수 있습니다. (Contributed by Éric Araujo and Amit Pitrou in bpo-5845.)
타르파일¶
tarfile 모듈은 스크립트로 직접 실행하거나 -m 을 통해 호출할 때 간단한 명령 줄 인터페이스 을 지원합니다. 이를 사용하여 tar파일 아카이브를 생성하고 추출할 수 있습니다. (Contributed by Berker Peksag in bpo-13477.)
textwrap¶
TextWrapper 클래스에 두 개의 새로운 어트리뷰트/생성자 인자가 추가되었습니다: 출력 줄 수를 제한하는 max_lines 와 max_lines 로 인해 출력이 잘린 경우 끝에 나타날 문자열인 placeholder 입니다. 이러한 기능을 바탕으로, 새로운 편의 기능 함수 shorten() 은 입력 내 모든 공백을 단일 공백으로 합치고, 지정된 width 만큼의 길이를 가지며 placeholder (기본값: [...])로 끝나는 단일 줄을 생성합니다. (Contributed by Antoine Pitrou and Serhiy Storchaka in bpo-18585 and bpo-18725.)
threading¶
메인 스레드를 나타내는 Thread 객체를 새로운 main_thread() 함수를 통해 얻을 수 있습니다. 일반적인 상황에서 이는 Python 인터프리터가 시작된 스레드입니다. (Contributed by Andrew Svetlov in bpo-18882.)
추적(Traceback)¶
새로운 traceback.clear_frames() 함수는 트레이스백 객체를 받아 참조하는 모든 프레임의 지역 변수를 제거함으로써 소비되는 메모리 양을 줄입니다. (Contributed by Andrew Kuchling in bpo-1565525.)
types¶
새로운 DynamicClassAttribute() 디스크립터는 인스턴스 객체를 통해 조회할 때는 정상적으로 동작하지만, 클래스를 통해 조회할 때는 클래스의 __getattr__ 로 전달되는 어트리뷰트를 정의하는 방법을 제공합니다. 이를 통해 클래스에서 활성화된 프로퍼티를 가지면서 동일한 이름을 가진 가상 어트리뷰트를 클래스에 둘 수 있습니다(예제는 enum 을 참조하십시오). (Contributed by Ethan Furman in bpo-19030.)
urllib¶
urllib.request 가 이제 DataHandler 클래스를 통해 :data:` URL을 지원합니다. (Contributed by Mathias Panzenböck in bpo-16423.)
Request 클래스에 의해 사용될 HTTP 메서드를 이제 서브클래스의 method 클래스 어트리뷰스를 설정하여 지정할 수 있습니다. (Contributed by Jason R Coombs in bpo-18978.)
Request 객체를 재사용할 수 있습니다. full_url 또는 data 어트리뷰트가 변경되면 모든 관련 내부 속성이 업데이트됩니다. 이는 예를 들어, 동일한 Request 객체를 다른 data 인자와 함께 여러 번의 OpenerDirector.open() 호출에서 사용하거나, Request 의 url 을 처음부터 다시 계산하는 대신 수정할 수 있음을 의미합니다. 또한 Request 에서 헤더를 제거하는 데 사용할 수 있는 새로운 remove_header() 메서드가 추가되었습니다. (Contributed by Alexey Kachayev in bpo-16464, Daniel Wozniak in bpo-17485, and Damien Brecht and Senthil Kumaran in bpo-17272.)
HTTPError 객체에 에러와 관련된 HTTP 응답 헤더에 접근할 수 있는 headers 어트리뷰트가 추가되었습니다. (Contributed by Berker Peksag in bpo-15701.)
unittest`¶
TestCase 클래스에 새로운 메서드인 subTest() 가 추가되었으며, 이는 with 블록이 “서브 테스트”가 되는 컨텍스트 관리자를 생성합니다. 이 컨텍스트 관리자를 사용하면 테스트 메서드 내에서 예를 들어 루프 안에서 subTest 컨텍스트 관리자를 호출함으로써 동적으로 서브 테스트를 생성할 수 있습니다. 이를 통해 단일 테스트 메서드에서 개별적으로 식별되고 구분되어 계산되는 무제한의 테스트를 생성할 수 있으며, 이들 중 하나 이상이 실패하더라도 모든 테스트가 실행됩니다. 예를 들어:
class NumbersTest(unittest.TestCase):
def test_even(self):
for i in range(6):
with self.subTest(i=i):
self.assertEqual(i % 2, 0)
여섯 개의 서브테스트를 생성하며, 각 서브테스트는 unittest 상세 출력에서 변수 이름 i 와 해당 값(i=0, i=1 등)으로 구성된 레이블로 식별됩니다. 이 예제의 전체 버전은 부분 테스트(subtest)를 사용하여 테스트 반복 구별 짓기 를 참조하십시오. (Antoine Pitrou가 bpo-16997 에서 기여함.)
unittest.main() 은 이제 defaultTest 에 대해 테스트 이름의 이터러블을 수용하며, 이전에는 단일 테스트 이름 문자열만 허용했습니다. (Jyrki Pulliainen이 bpo-15132 에서 기여함.)
테스트 검색 과정에서 (Zach Ware가 처리함, :issue:`16935.)
discover() 는 이제 일관된 테스트 순서를 제공하기 위해 발견된 파일들을 정렬합니다. (Martin Melin과 Jeff Ramnani가 bpo-16709 에서 기여함.)
TestSuite 는 테스트가 성공적으로 실행되면 즉시 해당 테스트에 대한 참조를 해제합니다. 가비지 컬렉션이 수행되는 Python 인터프리터에서 이는 다른 곳에서 참조하지 않는 한 테스트가 가비지 컬렉션되도록 합니다. 사용자 정의 _removeTestAtIndex 메서드를 정의하는 TestSuite 서브클래스를 생성하여 이 동작을 재정의할 수 있습니다. (Tom Wardill, Matt McClure, 그리고 Andrew Svetlov가 bpo-11798 에서 기여함.)
새로운 테스트 어설션 컨텍스트 매니저인 assertLogs() 는 주어진 코드 블록이 logging 모듈을 사용하여 로그 메시지를 출력하도록 보장합니다. 기본적으로 메시지는 모든 로거에서 발생할 수 있으며 우선순위는 INFO 이상이지만, 로거 이름과 대체 최소 로그 수준을 모두 지정할 수 있습니다. 컨텍스트 매니저가 반환하는 객체에서는 기록된 LogRecord 들 및/또는 포맷팅된 메시지를 조회할 수 있습니다. (Antoine Pitrou가 bpo-18937 에서 기여함.)
테스트 탐색이 이제 네임스페이스 패키지(namespace package)와 호환됩니다. (Claudiu Popa가 bpo-17457 에서 기여함.)
unittest.mock 객체는 이제 호출을 일치시킬 때 사양 서명(specification signature)을 확인합니다. 이는 인수를 위치뿐만 아니라 이름으로도 일치시킬 수 있음을 의미합니다. (Antoine Pitrou가 bpo-17015 에서 기여함.)
mock_open() 객체에 이제 readline 및 readlines 메서드가 추가되었습니다. (Toshio Kuratomi가 bpo-17467 에서 기여함.)
venv`¶
venv 에 이제 csh 및 fish 셸용 활성화 스크립트가 포함됩니다. (Andrew Svetlov가 bpo-15417 에서 기여함.)
EnvBuilder 및 create() 편의 함수는 새로운 키워드 인자 with_pip 을 수용하며, 이는 기본값이 False 이고 EnvBuilder 가 가상 환경에 pip 이 설치되는지 여부를 제어합니다. (Nick Coghlan이 PEP 453 구현의 일환으로 bpo-19552 에서 기여함.)
wave¶
getparams() 메서드가 이제 단순한 튜플 대신 namedtuple을 반환합니다. (Claudiu Popa가 bpo-17487 에서 기여함.)
wave.open() 이 이제 컨텍스트 관리 프로토콜을 지원합니다. (Claudiu Popa가 bpo-17616 에서 기여함.)
wave 를 사용하여 이제 탐색 불가능한 파일에 출력 쓰기 가 가능합니다. (David Jones, Guilherme Polo, 그리고 Serhiy Storchaka가 bpo-5202 에서 기여함.)
The writeframesraw() and
writeframes() methods now accept any bytes-like
object. (Contributed by Serhiy Storchaka in bpo-8311.)
weakref¶
새로운 WeakMethod 클래스가 결합된 메서드(bound method)에 대한 약한 참조를 시뮬레이션합니다. (Antoine Pitrou가 bpo-14631 에서 기여함.)
새로운 finalize 클래스는 약한 참조 자체의 생명 주기를 세심하게 관리할 필요 없이 객체가 가비지 수거될 때 호출될 콜백을 등록하는 기능을 제공합니다. (Richard Oudkerk가 bpo-15528 에서 기여함.)
ref 과 연관된 콜백이 있다면 이제 __callback__ 속성을 통해 노출됩니다. (Mark Dickinson이 bpo-17643 에서 기여함.)
xml.etree¶
새로운 파서인 XMLPullParser 를 통해 비차단 애플리케이션이 XML 문서를 구문 분석할 수 있습니다. 예제는 비 블로킹 구문 분석을 위한 풀(pull) API 에서 확인할 수 있습니다. (Antoine Pitrou가 bpo-17741 에서 기여함.)
xml.etree.ElementTree 의 tostring() 및 tostringlist() 함수와 ElementTree 의 write() 메서드가 이제 내용이 없는 엘리먼트를 축약된 형태(<tag />)로 쓸지 확장된 형태(<tag></tag>)로 쓸지 제어하는 short_empty_elements 키워드 전용 매개변수 를 제공합니다. (Ariel Poliak과 Serhiy Storchaka가 bpo-14377 에서 기여함.)
zipfile`¶
PyZipFile 클래스의 writepy() 메서드에 아카이브에 추가될 디렉터리와 파일을 제어하는 새로운 filterfunc 옵션이 추가되었습니다. 예를 들어, 이 옵션을 사용하여 테스트 파일을 아카이브에서 제외할 수 있습니다. (Christian Tismer가 bpo-19274 에서 기여함.)
ZipFile 및 PyZipFile 의 allowZip64 매개변수 기본값이 이제 True 입니다. (William Mallard가 bpo-17201 에서 기여함.)
CPython 구현 변경 사항¶
PEP 445: CPython 메모리 할당자 사용자 정의¶
PEP 445 는 CPython 인터프리터에서 메모리 할당을 사용자 정의하기 위한 새로운 C 수준 인터페이스를 추가합니다.
더 보기
- PEP 445 – 파이썬 메모리 할당자 조정을 위한 새 API 추가
Victor Stinner가 작성하고 구현한 PEP.
PEP 442: 안전한 객체 마무리(Finalization)¶
PEP 442 는 CPython의 객체 파이널리제이션(finalization)에 대한 현재의 제한과 문제를 해결합니다. 이를 통해 __del__() 메서드가 있는 객체와 finally 절이 포함된 제너레이터도 참조 순환의 일부일 때 파이널리제이션될 수 있습니다.
이 변경 사항의 일환으로, 대부분의 경우 인터프리터 종료 시 모듈 전역 변수가 더 이상 강제로 None`으로 설정되지 않으며, 대신 사이클릭 가비지 컬렉터의 정상적인 동작에 의존합니다. 이는 사이클릭 GC가 처음 도입된 이후 파이썬을 괴롭혀온, 주로 ``__del__` 메서드와 관련된 인터프리터 종료 시점의 오류 유형 전체를 방지합니다.
더 보기
- PEP 442 – 안전한 객체 파이널리제이션
Antoine Pitrou가 작성하고 구현한 PEP입니다.
PEP 456: 안전하고 상호 교환 가능한 해시 알고리즘¶
PEP 456 은 딕셔너리 조회를 기반으로 하는 공개 API가 노출될 수 있는 특정 DoS 공격에 대응하기 위해 파이썬의 해시 알고리즘에서 수행된 이전 보안 수정 작업을 계승합니다. (현재 단계의 개선 사항 시작에 대한 내용은 bpo-14621 을 참조하십시오.) 이 PEP는 CPython의 해시 코드를 통합하여 패키지 제작자가 다른 해시 알고리즘으로 교체하기 쉽게 만들고, 64비트 데이터 유형이 있는 플랫폼에서 파이썬의 기본 구현을 SipHash 구현으로 전환합니다. 이전 FNV 알고리즘과 비교했을 때 성능 차이는 미미합니다.
이 PEP는 현재 실행 중인 바이너리에서 사용되는 해시 알고리즘을 설명하기 위해 sys.hash_info 네임드 튜플에 추가 필드를 추가합니다. 그 외의 경우, 이 PEP는 기존 CPython API를 변경하지 않습니다.
PEP 436: Argument Clinic¶
“Argument Clinic”(PEP 436)이 이제 CPython 빌드 프로세스의 일부가 되었으며, C로 구현된 내장 기능 및 표준 라이브러리 확장 모듈에 대해 정확한 시그니처를 정의하고 유지 관리하는 과정을 단순화하는 데 사용될 수 있습니다.
일부 표준 라이브러리 확장 모듈이 파이썬 3.4에서 Argument Clinic을 사용하도록 전환되었으며, 그에 따라 pydoc 및 inspect 가 업데이트되었습니다.
파이썬 3.4 유지 관리 릴리스의 일부로 C로 구현된 추가 호출 가능 객체(callables)에 대한 프로그래밍적 인트로스펙션을 위한 시그니처 메타데이터가 추가될 예정입니다.
참고
Argument Clinic PEP는 현재 구현 상태를 완전히 반영하고 있지 않습니다. 이 경우 출시 관리자와 핵심 개발 팀은 Argument Clinic이 파이썬 3.4에서 서드파티 사용을 위한 공개 API로 제공되지 않으므로 이를 수용 가능한 것으로 판단했습니다.
더 보기
- PEP 436 – Argument Clinic DSL
Larry Hastings가 작성하고 구현한 PEP.
기타 빌드 및 C API 변경 사항¶
새로운
PyType_GetSlot()함수가 안정적인 ABI에 추가되어, 제한된 API를 사용할 때 이름이 지정된 타입 슬롯에서 함수 포인터를 가져올 수 있게 되었습니다. (bpo-17162 에서 Martin von Löwis이 기여함.)새로운
Py_SetStandardStreamEncoding()프리-이니셜라이제이션 API를 통해 CPython 인터프리터를 임베딩하는 애플리케이션이 표준 스트림에 대해 특정 인코딩과 에러 처리기를 확실하게 강제할 수 있습니다. (bpo-16129 에서 Bastien Montagne와 Nick Coghlan이 기여함.)문자열 인수를 변경하지 않는 대부분의 파이썬 C API가 이제
char *대신const char *를 수락하는 것으로 올바르게 표시됩니다. (bpo-1772673 에서 Serhiy Storchaka가 기여함.)파이썬 인터프리터를 사용할 수 없는 경우에도(예를 들어 크로스 컴파일 시나리오) 사용 가능한
python-config의 새로운 쉘 버전이 제공됩니다.PyUnicode_FromFormat()이 이제%s,%A,%U,%V,%S,%R에 대한 너비 및 정밀도 사양을 지원합니다. (bpo-7330 에서 Ysj Ray와 Victor Stinner가 기여함.)새로운 함수
PyStructSequence_InitType2()는 기존의PyStructSequence_InitType()함수를 보완합니다. 차이점은 성공 시0을, 실패 시-1을 반환한다는 점입니다.이제 CPython 소스를 최신 버전의 GCC 및 clang의 주소 무결성 검사 기능을 사용하여 컴파일할 수 있습니다. 작은 객체 할당기에서 발생하는 잘못된 알람이 해결되었습니다. (bpo-18596 에서 Dhiru Kholia가 기여함.)
윈도우 빌드에 이제 Address Space Layout Randomization 및 Data Execution Prevention 이 적용됩니다. (bpo-16632 에서 Christian Heimes가 기여함.)
새로운 함수
PyObject_LengthHint()는operator.length_hint()의 C API에 해당합니다. (bpo-16148 에서 Armin Ronacher가 기여함.)
기타 개선 사항¶
python 명령에 새로운 option 인
-I이 추가되었습니다. 이 옵션은 “격리 모드(isolated mode)”로 실행하게 하며, 이는sys.path에 스크립트 디렉터리나 사용자의site-packages디렉터리가 포함되지 않고 모든PYTHON*환경 변수가 무시됨을 의미합니다 (이는-s와-E를 모두 포함함). 목표는 스크립트 실행을 사용자의 환경으로부터 분리하는 것이며, 향후 더 많은 제약 사항이 추가될 수 있습니다. 이는 예를 들어 시스템 스크립트를 실행하기 위해 파이썬을 사용하는 경우에 적합합니다. 대부분의 POSIX 시스템에서 시스템 스크립트의#!라인에 사용할 수 있으며 권장됩니다. (bpo-16499 에서 Christian Heimes가 기여함.)readline을 지원하는 시스템에서는 이제 대화형 인터프리터에서 기본으로 탭 완성이 활성화됩니다. 히스토리도 기본으로 활성화되며,~/.python-history파일에 기록되고 읽힙니다. (bpo-5845 에서 Antoine Pitrou와 Éric Araujo가 기여함.)--version으로 파이썬 인터프리터를 실행하면 이제 표준 에러 대신 표준 출력에 버전을 출력합니다. (bpo-18338). 이와 유사한 변경 사항이argparse(bpo-18920) 및 기타 스크립트 방식의 호출 기능을 갖춘 모듈들(bpo-18922)에도 적용되었습니다.CPython Windows 설치 프로그램은 이제 확장 프로그램이 등록될 때
PATHEXT변수에.py를 추가하여, 사용자가 윈도우 명령 프롬프트에서 .py 확장자 없이 이름만 입력하여 파이썬 스크립트를 실행할 수 있도록 합니다. (bpo-18569 에서 Paul Moore가 기여함.)새로운
make타겟 coverage-report 는 파이썬을 빌드하고, 테스트 스위트를 실행하며,gcov및 lcov 를 사용하여 C 코드베이스에 대한 HTML 커버리지 보고서를 생성합니다.python regression test suite 의
-R옵션은 이제sys.getallocatedblocks()를 사용하여 메모리 할당 누수도 확인합니다. (bpo-13390 에서 Antoine Pitrou가 기여함.)python -m이 이제 네임스페이스 패키지(namespace packages)와 함께 작동합니다.stat모듈이 이제 C로 구현되어, 이전처럼 파이썬 모듈에 값이 하드코딩되는 대신 C 헤더 파일에서 상수의 값을 가져옵니다.단일 OS 모듈(
.so,.dll)에서 여러 파이썬 모듈을 로드하는 것이 이제 올바르게 작동합니다. (이전에는 파일 내의 첫 번째 파이썬 모듈만 조용히 반환했습니다.) (bpo-16421 에서 Václav Šmilauer가 기여함.)새로운 옵코드
LOAD_CLASSDEREF가 추가되어, 특정 방식의 __prepare__ 사용으로 인해 발생할 수 있는 클래스 본문의 자유 변수 로딩 버그를 수정합니다. (bpo-17853 에서 Benjamin Peterson이 기여함.)Victor Stinner가 그의 PEP 445 기반
pyfailmalloc도구를 사용하여 여러 개의 MemoryError 관련 충돌을 확인하고 해결했습니다. (bpo-18408, bpo-18520.)pyvenv명령이 이제 심볼릭 링크가 기본인 시스템에서도 심볼릭 링크 대신 복사본을 사용하도록 하는--copies옵션을 지원합니다. (bpo-18807 에서 Vinay Sajip이 기여함.)pyvenv명령은 또한 가상 환경에 pip를 자동으로 부트스트래핑하는 과정을 생략하기 위해--without-pip옵션을 지원합니다. (bpo-19552 에서 Nick Coghlan이 기여함. PEP 453 구현의 일부임.)PYTHONIOENCODING환경 변수의 설정값에서 인코딩 이름이 이제 선택 사항입니다. 이를 통해 기본 인코딩을 변경하지 않고 에러 처리자만 설정할 수 있습니다. (bpo-18818 에서 Serhiy Storchaka가 기여함.)bz2,lzma, 그리고gzip모듈의open함수가 이제x(배타적 생성) 모드를 지원합니다. (bpo-19201, bpo-19222, 및 bpo-19223 에서 Tim Heaney와 Vajrasky Kok가 기여함.)
주요 최적화¶
UTF-32 디코더가 이제 3배에서 4배 더 빨라졌습니다. (bpo-14625 에서 Serhiy Storchaka가 기여함.)
집합(set)에 대한 해시 충돌 비용이 절감되었습니다. 각 해시 테이블 탐색은 이제 임의로 탐색을 계속하기 전에 연속적이고 인접한 키/해시 쌍들을 일련으로 확인합니다. 이는 캐시 지역성을 활용하여 충돌 해결 비용을 줄입니다. 이 충돌 해결 방식은 선형 탐색과 개방형 주소 지정법의 혼합이라고 설명할 수 있습니다. 추가 선형 탐색 횟수는 기본값 9입니다. 컴파일 시 LINEAR_PROBES를 임의의 값으로 정의하여 이를 변경할 수 있습니다. LINEAR_PROBES=0으로 설정하면 선형 탐색을 완전히 비활성화합니다. (bpo-18771 에서 Raymond Hettinger가 기여함.)
인터프리터 시작 속도가 약 30% 향상되었습니다. 몇 가지 측정 결과로 성능이 개선되었습니다. 인터프리터는 시작 시 더 적은 모듈을 로드하며, 예를 들어
re,collections,locale모듈과 그 의존성들이 더 이상 기본으로 임포트되지 않습니다. marshal 모듈은 컴파일된 파이썬 코드를 더 빨리 로드하도록 개선되었습니다. (bpo-19219, bpo-19218, bpo-19209, bpo-19205 및 bpo-9548 에서 Antoine Pitrou, Christian Heimes, Victor Stinner가 기여함.)bz2.BZ2File은 이제 대부분의 경우 파이썬 2 버전보다 빠르거나 대등합니다.lzma.LZMAFile도 최적화되었습니다. (bpo-16034 에서 Serhiy Storchaka와 Nadeem Vawda가 기여함.)random.getrandbits()이 작은 정수(가장 일반적인 사용 사례)에 대해 20%~40% 더 빨라졌습니다. (bpo-16674 에서 Serhiy Storchaka가 기여함.)새로운 문자열 저장 형식을 활용함으로써 문자열 피클링이 훨씬 더 빨라졌습니다. (bpo-15596 에서 Victor Stinner와 Antoine Pitrou가 기여함.)
io.FileIO.readall()에서 발생하던 성능 문제가 해결되었습니다. 이 문제는 특히 Windows 환경에 영향을 미치며,subprocess를 통해 많은 양의 데이터를 파이프로 전달하는 경우 속도를 크게 향상시킵니다. (Richard Oudkerk가 bpo-15758 을 통해 기여함.)html.escape()의 속도가 기존보다 10배 빨라졌습니다. (Matt Bryant가 bpo-18020 을 통해 기여함.)Windows에서
obmalloc의 CRTmalloc대신 네이티브VirtualAlloc을 사용합니다. 인위적인 벤치마크 결과 약 3%의 메모리 절약 효과가 확인되었습니다.os.urandom()이 이제 지연 실행 방식으로 열린 지속성 파일 기술자를 사용하여, 여러 스레드에서 병렬로 실행될 때 많은 파일 기술자를 소모하는 것을 방지합니다. (Antoine Pitrou가 bpo-18756 을 통해 기여함.)
폐지됨¶
이 섹션에서는 Python 3.4에서 폐지되었으며 Python 3.5 또는 이후 버전에서 제거될 예정인 다양한 API와 기타 기능을 다룹니다. 대부분의 경우(전부는 아님), 폐지된 API를 사용하면 경고 기능이 활성화된 상태(예: -Wd 사용)에서 인터프리터를 실행할 때 DeprecationWarning 이 발생합니다.
Python API의 폐지 사항¶
PEP 451: 임포트 시스템을 위한 ModuleSpec 타입 에서 언급된 바와 같이, 여러
importlib메서드 및 함수가 폐지되었습니다:importlib.find_loader()는importlib.util.find_spec()으로 대체됩니다. ;importlib.machinery.PathFinder.find_module()은importlib.machinery.PathFinder.find_spec()으로 대체됩니다. ;importlib.abc.MetaPathFinder.find_module()은importlib.abc.MetaPathFinder.find_spec()으로 대체됩니다. ;importlib.abc.PathEntryFinder.find_loader()및find_module()은importlib.abc.PathEntryFinder.find_spec()으로 대체됩니다. ; 모든xxxLoaderABCload_module메서드들(importlib.abc.Loader.load_module,importlib.abc.InspectLoader.load_module,importlib.abc.FileLoader.load_module,importlib.abc.SourceLoader.load_module)은 더 이상 구현할 필요가 없으며, 대신 로더는exec_module메서드(importlib.abc.Loader.exec_module(),importlib.abc.InspectLoader.exec_module(),importlib.abc.SourceLoader.exec_module())를 구현하고 나머지는 임포트 시스템이 처리하도록 해야 합니다. ; 또한,importlib.abc.Loader.module_repr(),importlib.util.module_for_loader(),importlib.util.set_loader(), 및importlib.util.set_package()는 이제 임포트 시스템에서 자동으로 처리되므로 더 이상 필요하지 않습니다.imp모듈은 폐지 예정입니다. Python 2/3 코드 기반과의 호환성을 유지하기 위해 해당 모듈의 삭제는 현재 계획되어 있지 않습니다.formatter모듈은 폐지 예정이며, Python 3.6에서 제거될 예정입니다.hmac.new()함수의 기본 digestmod*인 ``MD5``가 폐지되었습니다. Python 3.6부터는 *digestmod 인자로 명시적인 다이제스트 이름이나 생성자를 요구합니다.ftplib모듈의 내부Netrc클래스는 한동안 문서 내에서 폐지된 것으로 기록되어 왔습니다. 이제 이 클래스는DeprecationWarning을 발생시키며, Python 3.5에서 완전히 제거될 예정입니다.subprocess.Popen.wait()의 문서화되지 않은 endtime 인자는 노출되어서는 안 되었으며 현재 사용 중이지 않기를 바랍니다. 이 인자는 폐지되었으며 Python 3.5에서 제거될 가능성이 높습니다.HTMLParser의 strict 인자가 폐지되었습니다.plistlib`의 :func:!readPlist`,writePlist(),readPlistFromBytes(), 및writePlistToBytes()함수는 새로운 기능인load(),dump(),loads(), 및:func:()!Data` 또한 단순히bytes생성자를 사용하는 방식으로 대체되어 폐지되었습니다.sysconfig의 키SO가 폐지되었으며,EXT_SUFFIX로 대체되었습니다.다양한
open함수에서 허용되는U모드가 폐지되었습니다. Python3에서는 아무런 유용한 기능도 수행하지 않으므로, 필요 시io.TextIOWrapper및 그 newline 인자를 적절히 사용하는 방식으로 대체해야 합니다.xml.etree.ElementTree.iterparse()의 parser 인자와XMLParser()의 html 인자가 폐지되었습니다. 후자의 제거에 대비하여,XMLParser의 모든 인자는 키워드 인자로 전달해야 합니다.
폐지된 기능¶
IDLE — 파이썬 편집기와 셸 을
-n플래그(서브프로세스 없음)와 함께 실행하는 기능이 폐지되었습니다. 그러나 이 기능은 bpo-18823 이 해결될 때까지 제거되지 않습니다.site 모듈에서 존재할 경우 “site-python” 디렉터리를 sys.path에 추가하는 기능이 폐지되었습니다 (bpo-19375).
제거됨¶
더 이상 지원되지 않는 운영 체제¶
다음 운영 체제에 대한 지원이 소스 및 빌드 도구에서 제거되었습니다:
API 및 기능 제거¶
다음의 쓸모없거나 이전에 폐지된 API 및 기능들이 제거되었습니다:
유지관리되지 않는
Misc/TextMate및Misc/vim디렉터리가 제거되었습니다(대신 사용할 제안 사항은 devguide <https://devguide.python.org> 를 참조하십시오).SO메이크파일 매크로가 제거되었습니다(SHLIB_SUFFIX및EXT_SUFFIX매크로로 대체됨) (bpo-16754).PyThreadState.tick_counter필드가 제거되었습니다. 해당 값은 “새로운 GIL”이 도입된 Python 3.2 이후로 의미가 없었습니다 (bpo-19199).PyLoader및PyPycLoader가importlib에서 제거되었습니다. (Taras Lyapun이 bpo-15641 을 통해 기여함.)HTTPConnection및HTTPSConnection의 strict 인자가 제거되었습니다. HTTP 0.9 스타일의 “단순 응답(Simple Responses)”은 더 이상 지원되지 않습니다.폐지된
urllib.request.Request의 게터 및 세터 메서드인add_data,has_data,get_data,get_type,get_host,get_selector,set_proxy,get_origin_req_host및is_unverifiable가 제거되었습니다(대신 직접 속성에 액세스하십시오).marshal에서 폐지된TYPE_INT64를 로드하는 기능이 제거되었습니다. (Dan Riti가 bpo-15480 을 통해 기여함.)inspect.Signature: 위치 전용(positional-only) 매개변수는 이제 유효한 이름을 가져야 합니다.object.__format__()no longer accepts non-empty format strings, it now raises aTypeErrorinstead. Using a non-empty string has been deprecated since Python 3.2. This change has been made to prevent a situation where previously working (but incorrect) code would start failing if an object gained a __format__ method, which means that your code may now raise aTypeErrorif you are using an's'format code with objects that do not have a __format__ method that handles it. See bpo-7994 for background.difflib.SequenceMatcher.isbjunk()anddifflib.SequenceMatcher.isbpopular()were deprecated in 3.2, and have now been removed: usex in sm.bjunkandx in sm.bpopular, where sm is aSequenceMatcherobject (bpo-13248).
코드 정리¶
Python 3.4로 이식¶
이 섹션은 이전에 설명된 변경 사항과 코드를 수정해야 할 수도 있는 기타 버그 수정을 나열합니다.
‘python’ 명령 동작의 변경¶
posix 셸에서
PATH환경 변수를 빈 값으로 설정하는 것은 아예 설정하지 않는 것과 동일합니다. 그러나PYTHONPATH를 빈 값으로 설정하는 것은 설정하지 않은 것과 동일하지 않았습니다. 즉,PYTHONPATH를 빈 값으로 설정하는 것은.으로 설정하는 것과 같았으며, 이는PATH의 동작 방식에 비추어 생각할 때 혼동을 야기했습니다. 이제 이 동작은PATH에 대한 posix 관례를 따릅니다.CPython 인터프리터의 디버그(
--with-pydebug) 빌드에서 출력되는 [X refs, Y blocks]가 이제 기본적으로 꺼져 있습니다.-X showrefcount옵션을 사용하여 다시 활성화할 수 있습니다. (Ezio Melotti가 bpo-17323 을 통해 기여함.)python 명령과 대부분의 표준 라이브러리 스크립트(및
argparse)가 이제--version정보를stderr대신stdout으로 출력합니다(상세 이슈 목록은 위의 기타 개선 사항 를 참조하십시오).
파이썬 API 변경 사항¶
importlib.abc에 정의된 ABC는 이제 무조건적으로NotImplementedError를 발생시키는 대신 적절한 예외를 발생시키거나 기본값을 반환합니다. 이는super()를 호출하고 최종적으로 ABC까지 도달하는 코드에만 영향을 미칩니다. 호환성을 위해 필요에 따라NotImplementedError또는 해당 예외 중 하나를 모두 처리하십시오.모듈 타입은 이제
__package__와__loader__속성을 기본적으로None으로 초기화합니다. 이러한 속성이 하위 호환성이 있는 방식으로 설정되었는지 확인하려면 예를 들어getattr(module, '__loader__', None) is not None을 사용하십시오. (bpo-17115.)importlib.util.module_for_loader()는 이제 재로드를 올바르게 지원하기 위해__loader__및__package__를 무조건 설정합니다. 이를 원하지 않는 경우 해당 속성들을 수동으로 설정해야 합니다. 모듈 관리를 위해importlib.util.module_to_load()를 사용할 수 있습니다.임포트 시 재로드할 때 관련 속성(예:
__name__,__loader__,__package__,__file__,__cached__)을 무조건 재설정합니다. 이는 모듈이 재로드될 때 다시 검색되는 것을 의미하며, 3.3 이전의 동작 방식을 복원하는 것입니다 (bpo-19413).동결된(frozen) 패키지는 더 이상
__path__를 패키지 이름을 포함하는 리스트로 설정하지 않고, 빈 리스트로 설정합니다. 이전 방식은 동결된 패키지와 동일한 이름의 디렉터리가 있는 경우 서브모듈 임포트 시 시스템이 잘못된 동작을 수행할 수 있었습니다. 모듈이 패키지인지 여부 확인을 위한 올바른 방법은hasattr(module, '__path__')를 사용하는 것입니다. (bpo-18065).동결된(frozen) 모듈은 더 이상
__file__속성을 정의하지 않습니다. 동결된 모듈이 명시적인 위치에서 로드되지 않으므로 이 속성을 설정하는 것은 의미상 적절하지 않습니다. 모듈이 동결된 코드 출신인지 확인해야 하는 경우, 모듈의__spec__.location이'frozen'으로 설정되어 있는지 확인하거나, 로더가importlib.machinery.FrozenImporter의 하위 클래스인지 확인하십시오. 파이썬 2 호환성이 필요한 경우에는imp.is_frozen()을 사용할 수 있습니다.py_compile.compile()은 쓰기 대상 파일 경로가 심볼릭 링크(symlink) 또는 정규 파일이 아닌 경우 이제FileExistsError를 발생시킵니다. 이는 임포트 시 원래 어떤 종류의 파일 경로였든 상관없이 해당 파일을 정규 파일로 덮어쓴다는 것을 경고하기 위한 것입니다.importlib.abc.SourceLoader.get_source()는 로드되는 소스 코드가SyntaxError또는UnicodeDecodeError를 발생시킬 때 더 이상ImportError를 발생시키지 않습니다.ImportError는 소스 코드를 찾을 수 없을 때만 발생하는 것으로 의도되었으며, 소스 코드는 존재하지만 구조가 잘못된 경우까지 이 의미를 확장하는 것은 과도한 것이라 판단되었습니다. 이전 버전에서 ImportError를 캐치하면서 구문이나 디코딩 문제를 무시하고 싶다면 이제 세 가지 예외를 모두 캐치하십시오.functools.update_wrapper()및@functools.wraps`는 데코레이션되는 함수가 이미 ``__wrapped__`속성을 가지고 있는 경우에도 해당 기능에 맞춰__wrapped__속성을 올바르게 설정합니다. 이는 이제__wrapped__속성이 체인 내의 모든 항목이 가장 내부의 함수를 가리키는 대신, 데코레이션된 함수의 스택을 올바르게 연결함을 의미합니다. 이전 방식이 의도적이라고 가정했던 인트로스펙션(introspection) 라이브러리는inspect.unwrap`을 사용하여 ``__wrapped__`()속성이 없는 체인 내의 첫 번째 함수에 접근할 수 있습니다.inspect.getfullargspec()이inspect.signature()를 기반으로 재구현되어 과거보다 훨씬 다양한 종류의 호출 가능(callable) 객체를 처리합니다. Python 3.4 시리즈 과정에서 추가적인 내장 및 확장 모듈 콜러블들이 시그니처 메타데이터를 얻게 될 것으로 예상됩니다.inspect.getfullargspec()이 파이썬 이외의 호출 가능한 대상에서 실패할 것이라고 가정하는 코드는 그에 따라 조정이 필요할 수 있습니다.importlib.machinery.PathFindernow passes on the current working directory to objects insys.path_hooksfor the empty string. This results insys.path_importer_cachenever containing'', thus iterating throughsys.path_importer_cachebased onsys.pathwill not find all keys. A module’s__file__when imported in the current working directory will also now have an absolute path, including when using-mwith the interpreter (except for__main__.__file__when a script has been executed directly using a relative path) (Contributed by Brett Cannon in bpo-18416). is specified on the command-line) (bpo-18416).HTTPConnection및HTTPSConnection에서 strict 인자가 제거됨에 따라, 키워드가 아닌 위치 기반으로 인자를 명시하는 경우 나머지 인자들의 의미가 변경됩니다. 그동안 경고 메시지에 주의를 기울여 오셨다면, 현재 코드에서 추가적인 인자들은 이미 키워드를 통해 명시되고 있을 것입니다.from __future__ import ...문장 사이의 문자열은 이제 항상SyntaxError`를 발생시킵니다. 이전에는 앞부분에 독스트링이 없는 경우 중간에 삽입된 문자열이 때때로 무시되었습니다. 이 변경을 통해 CPython은 언어 사양을 준수하게 되었습니다(Jython과 PyPy는 이미 준수 중이었습니다). (:issue:`17434).ssl.SSLSocket.getpeercert()및ssl.SSLSocket.do_handshake()는 이제SSLSocket이 연결되지 않았을 때 기존의AttributeError대신ENOTCONN이 포함된OSError를 발생시킵니다. 또한,getpeercert()는 핸드쉐이크가 아직 완료되지 않은 경우ValueError를 발생시킵니다.base64.b32decode()는 이제 입력 문자열에 b32-알파벳이 아닌 문자가 포함된 경우TypeError대신binascii.Error를 발생시킵니다. 이 특정TypeError는 다른TypeError들이 변환될 때 누락되었습니다. (Serhiy Storchaka가 bpo-18011 에서 기여). 참고: 이 변경 사항은 파이썬 3.3.3에도 실수로 적용되었습니다.file속성은 이제 생성하는cgi.FieldStorage인스턴스가 가비지 컬렉션되면 자동으로 닫힙니다. 만약 파일 객체를cgi.FieldStorage인스턴스에서 별도로 가져오고 그 인스턴스를 살아있게 유지하지 않았다면, 전체cgi.FieldStorage인스턴스를 저장하거나cgi.FieldStorage인스턴스가 가비지 컬렉트되기 전에 파일의 내용을 읽어야 합니다.`닫힌 SSL 소켓에서
read또는write를 호출하면 이제 이전의 모호한AttributeError대신 정보가 포함된ValueError를 발생시킵니다. (bpo-9177).slice.indices()는 이제 매우 큰 값에 대해OverflowError를 발생시키지 않습니다. 이 수정의 결과로,slice.indices()는 음수 길이가 주어질 경우 현재는ValueError를 발생시킵니다. 이전에는 의미 없는 값이 반환되었습니다. (bpo-14794).The
complexconstructor, unlike thecmathfunctions, was incorrectly acceptingfloatvalues if an object’s__complex__special method returned one. This now raises aTypeError. (bpo-16290.)3.2 및 3.3의
int생성자는 base 매개변수에 대해float값을 잘못 수용했습니다. 실제로 누군가가 이렇게 사용했을 가능성은 낮지만, 앞으로는TypeError`를 발생시킵니다. (:issue:`16772).키워드 전용(keyword-only) 인자의 기본값은 이제 일반 키워드 인수의 기본값보다 나중 에 평가됩니다. 이전의 오류가 있는 동작에 의존하는 코드가 작성되지 않았기를 바랍니다. (bpo-16967).
fork()이후에 오래된 스레드 상태가 제거됩니다. 이로 인해 이전에는 부적절하게 계속 유지되었던 일부 시스템 자원(예: 스레드 로컬 저장소에 보관된 데이터베이스 연결)이 해제될 수 있습니다. (bpo-17094).이제
__annotations__딕셔너리의 파라미터 이름이__kwdefaults__와 유사하게 올바르게 망글링됩니다. (Yury Selivanov가 bpo-20625 에서 기여)hashlib.hash.name`은 이제 항상 식별자를 소문자로 반환합니다. 이전에는 일부 내장 해시가 대문자 이름을 가졌으나, 이제 공식적인 공개 인터페이스가 되었으므로 명칭을 일관되게 변경했습니다. (:issue:`18532).Because
unittest.TestSuitenow drops references to tests after they are run, test harnesses that reuse aTestSuiteto re-run a set of tests may fail. Test suites should not be re-used in this fashion since it means state is retained between test runs, breaking the test isolation thatunittestis designed to provide. However, if the lack of isolation is considered acceptable, the old behavior can be restored by creating aTestSuitesubclass that defines a_removeTestAtIndexmethod that does nothing (seeTestSuite.__iter__()) (bpo-11798).unittest은 이제 명령줄 파싱을 위해argparse를 사용합니다. 이전에는 작동했으나 더 이상 허용되지 않는 특정 부적절한 명령 형식이 있습니다. 이론적으로 이러한 형식들은 의미가 없었으며 실제로 사용될 가능성도 낮기 때문에 하위 호환성 문제는 발생하지 않을 것입니다.re.split(),re.findall(), 그리고re.sub()함수와match객체의group()및groups()메서드는 이제 일치할 문자열이 bytes-like object 인 경우 항상 bytes 객체를 반환합니다. 이전에는 반환 유형이 입력 유형과 일치했으므로, 결과값이 예를 들어bytearray임을 기대하는 코드가 있다면 수정이 필요합니다.audioop함수는 이제 문자열 입력이 전달될 경우 나중에 무작위로 실패하는 대신 즉시 오류를 발생시킵니다. (bpo-16685).HTMLParser에 추가된 convert_charrefs 인자는 현재 하위 호환성을 위해False가 기본값이지만, 향후에는True로 변경될 예정입니다. 코드 내의 모든HTMLParser호출에 이 키워드와 적절한 값을 추가하는 것을 권장합니다. (bpo-13633).hmac.new()함수의 digestmod 인자가 향후 기본값을 가지지 않게 되므로, 모든hmac.new()호출을 수정하여 digestmod 를 명시적으로 지정해야 합니다. (bpo-17276).sysconfig.get_config_var()을SO키와 함께 호출하거나,sysconfig.get_config_vars()결과에서SO를 찾는 것은 더 이상 권장되지 않습니다. 이 키는 문맥에 따라EXT_SUFFIX또는SHLIB_SUFFIX로 교체해야 합니다. (bpo-19555).U를 지정하는 모든open함수 호출을 수정해야 합니다. 파이썬 3에서U는 효과가 없으며, 사용 시 결국 오류를 발생시킵니다. 함수에 따라 이전 파이썬 2와 동일한 동작은 newline 인자를 사용하거나, 필요한 경우 스트림을TextIOWrapper로 감싸서 해당 newline 인자를 사용하여 구현할 수 있습니다. (bpo-15204).스크립트에서
pyvenv를 사용하면서 pip이 설치되지 않기를 원한다면, 명령 실행 시--without-pip을 추가해야 합니다.json.dump()및json.dumps`에서 인덴트가 지정될 때의 기본 동작이 변경되었습니다: 이제 줄 끝에서 쉼표로 구분되는 항목 뒤에 공백이 더 이상 생성되지 않습니다. 이 변경 사항은 해당 출력에 대해 공백에 민감한 비교를 수행하는 테스트가 있는 경우에만 중요합니다. (:issue:`16333()).doctest`가 이제 확장 모듈의 ``__doc__`문자열에서도 doctest를 찾습니다. 따라서 테스트 탐색 범위에 doctest와 유사한 내용을 포함하는 확장 모듈이 포함되어 있다면, 테스트 실행 시 이전에 본 적 없는 실패 사례를 발견할 수 있습니다. (bpo-3158).collections.abc모듈이 파이썬 시작 개선 과정의 일환으로 약간 재구조화되었습니다. 이로 인해collections를 임포트할 때collections.abc가 자동으로 임포트되지 않습니다. 만약 프로그램이 (문서화되지 않은) 암시적 임포트에 의존했다면, 명시적인import collections.abc를 추가해야 합니다. (bpo-20784).
C API 변경 사항¶
PyEval_EvalFrameEx(),PyObject_Repr(),PyObject_Str()및 기타 일부 내부 C API들은 이제 활성화된 예외를 소리 없이 버릴 수 있는 상황에서 사용되지 않음을 보장하는 디버깅 단언문(assertion)을 포함합니다. 활성 예외를 버리는 것이 예상되고 의도된 경우(예:PyErr_Fetch()로 이미 로컬에 저장했거나 다른 예외로 의도적으로 교체한 경우), 이러한 동작을 직접 또는 간접적으로 호출할 때 단언문이 트리거되지 않도록 하기 위해 명시적인PyErr_Clear()호출이 필요합니다(단, 단언문 기능이 활성화된 상태로 컴파일된 파이썬 버전인 경우).PyErr_SetImportError()은 이제 msg 인자가 설정되지 않았을 때TypeError를 설정합니다. 이전에는NULL만 반환되었습니다.PyOS_ReadlineFunctionPointer콜백의 결과는 이제PyMem_Malloc()또는PyMem_Realloc()으로 할당된 문자열 대신,PyMem_RawMalloc()또는PyMem_RawRealloc()로 할당된 문자열이어야 하며, 오류 발생 시NULL이어야 합니다. (bpo-16742)PyThread_set_key_value()는 이제 항상 값을 설정합니다. Python 3.3에서는 키가 이미 존재하는 경우(현재 값이NULL이 아닌 포인터인 경우) 함수가 아무것도 하지 않았습니다.PyFrameObject구조체의f_tstate(스레드 상태) 필드가 버그 수정을 위해 제거되었습니다. 근거는 bpo-14432 를 참조하십시오.
3.4.3에서 변경됨¶
PEP 476: 표준 라이브러리(stdlib) HTTP 클라이언트에 대해 기본적으로 인증서 확인 활성화¶
http.client 및 이를 사용하는 urllib.request, xmlrpc.client 등의 모듈은 이제 기본적으로 서버가 플랫폼 신뢰 저장소의 CA에 의해 서명되었으며 요청된 호스트네임과 일치하는 인증서를 제공하는지 확인하므로, 많은 애플리케이션의 보안이 크게 향상됩니다.
이전 동작 방식이 필요한 애플리케이션의 경우 다음의 대체 컨텍스트를 전달할 수 있습니다:
import urllib.request
import ssl
# 모든 검증을 비활성화합니다
context = ssl._create_unverified_context()
# 신뢰 저장소에 포함되지 않아도 되는 특정 인증서를 호스트에 대해 사용할 수 있게 합니다.
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib.request.urlopen("https://invalid-cert", context=context)