# 파이썬 3.6의 새로운 기능

편집자:

  Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>

이 기사에서는 3.5와 비교하여 파이썬 3.6의 새로운 기능을 설명합니다. 파이썬 3.6은 2016년 12월 23일에 출시되었습니다. 전체 변경 목록은 changelog를 참조하십시오.

더 보기

PEP 494 - 파이썬 3.6 출시 일정

## 요약 – 배포 주요 사항

새로운 문법 기능:

- PEP 498, 포맷 문자열 리터럴.

- PEP 515, 숫자 리터럴의 밑줄.

- PEP 526, 변수 어노테이션 문법.

- PEP 525, 비동기 제너레이터.

- PEP 530: 비동기 컴프리헨션.

새로운 라이브러리 모듈:

- `secrets`: PEP 506 – 표준 라이브러리에 secret 모듈 추가.

CPython 구현 개선:

- dict 형은 Raymond Hettinger의 제안에 기반한 더욱더 간결한 표현을 사용하도록 재구현되었으며 PyPy 딕셔너리 구현과 유사합니다. 이로 인해 파이썬 3.5와 비교할 때 딕셔너리가 20%에서 25% 적은 메모리를 사용하게 되었습니다.

- 새 프로토콜로 클래스 생성의 사용자 정의가 단순화되었습니다.

- 클래스 어트리뷰트 정의 순서는 이제 보존됩니다.

- `**kwargs`의 요소 순서는 이제 키워드 인자가 함수에 전달된 순서에 해당합니다.

- DTrace와 SystemTap 프로브 지원이 추가되었습니다.

- 이제 새로운 PYTHONMALLOC 환경 변수를 사용하여 인터프리터 메모리 할당과 액세스 에러를 디버깅 할 수 있습니다.

표준 라이브러리 대폭 개선:

- `asyncio` 모듈은 새로운 기능, 상당한 사용성 및 성능 향상, 상당한 양의 버그 수정을 받았습니다. 파이썬 3.6부터 `asyncio` 모듈은 더는 잠정적이지 않으며 해당 API는 안정적인 것으로 간주합니다.

- 경로류 객체를 지원하기 위해 새로운 파일 시스템 경로 프로토콜이 구현되었습니다. 경로에서 작동하는 모든 표준 라이브러리 함수가 새 프로토콜과 함께 작동하도록 갱신되었습니다.

- `datetime` 모듈은 현지 시간 명확성에 대한 지원을 얻었습니다.

- `typing` 모듈은 여러 개선을 받았습니다.

- `tracemalloc` 모듈은 크게 다시 작업 되었으며 이제 `ResourceWarning`에 대해 더 나은 출력을 제공하고 메모리 할당 에러에 대한 더 나은 진단을 제공하는 데 사용됩니다. 자세한 내용은 PYTHONMALLOC 섹션을 참조하십시오.

보안 향상:

- 새로운 `secrets` 모듈이 추가되어 계정 인증, 토큰 등과 같은 비밀 관리에 적합한 암호화 된 강력한 의사 난수 생성을 단순화합니다.

- 리눅스에서, `os.urandom()`은 이제 보안을 강화하기 위해 시스템 urandom 엔트로피 풀이 초기화될 때까지 블록합니다. 근거는 PEP 524를 참조하십시오.

- `hashlib`와 `ssl` 모듈은 이제 OpenSSL 1.1.0을 지원합니다.

- `ssl` 모듈의 기본 설정과 기능 집합이 개선되었습니다.

- `hashlib` 모듈은 BLAKE2, SHA-3 및 SHAKE 해시 알고리즘과 `scrypt()` 키 파생 함수에 대한 지원을 받았습니다.

윈도우 개선:

- PEP 528과 PEP 529, 윈도우 파일 시스템과 콘솔 인코딩이 UTF-8로 변경되었습니다.

- `py.exe` 런처는 대화식으로 사용할 때 사용자가 버전을 지정하지 않을 때 (명령 줄 인자나 구성 파일을 통해) 더는 파이썬 3보다 파이썬 2를 선호하지 않습니다. 셔뱅 줄의 처리는 변경되지 않았습니다 - 이 경우 “python”은 파이썬 2를 나타냅니다.

- `python.exe`와 `pythonw.exe`는 긴 경로 인식으로 표시되어서, 260자 경로 제한이 더는 적용되지 않을 수 있음을 뜻합니다. 자세한 내용은 MAX_PATH 제한 제거를 참조하십시오.

- `._pth` 파일을 추가하여 격리 모드를 강제 적용하고 모든 검색 경로를 완전히 지정하여 레지스트리와 환경 조회를 방지할 수 있습니다. 자세한 정보는 설명서를 참조하십시오.

- 이제 `python36.zip` 파일이 `PYTHONHOME`을 추론하는 랜드 마크로 작동합니다. 자세한 정보는 설명서를 참조하십시오.

## 새로운 기능

### PEP 498: 포맷 문자열 리터럴

PEP 498은 새로운 종류의 문자열 리터럴 f-문자열(f-strings), 또는 포맷 문자열 리터럴을 도입합니다.

포맷 문자열 리터럴은 `'f'`를 접두어로 사용하고 `str.format()`에서 허용하는 포맷 문자열과 유사합니다. 중괄호로 둘러싸인 치환 필드가 포함됩니다. 치환 필드는 실행 시간에 평가된 다음 `format()` 프로토콜을 사용하여 포맷되는 표현식입니다:

    >>> name = "Fred"
    >>> f"He said his name is {name}."
    'He said his name is Fred.'
    >>> width = 10
    >>> precision = 4
    >>> value = decimal.Decimal("12.34567")
    >>> f"result: {value:{width}.{precision}}"  # 중첩된 필드
    'result:      12.35'

더 보기

PEP 498 – 리터럴 문자열 보간.

  Eric V. Smith가 작성하고 구현한 PEP.

기능 설명서.

### PEP 526: 변수 어노테이션 문법

PEP 484는 함수 매개 변수의 형 어노테이션, 일명 형 힌트에 대한 표준을 도입했습니다. 이 PEP는 클래스 변수와 인스턴스 변수를 포함한 변수 형에 어노테이트하기 위해 파이썬에 구문을 추가합니다:

    primes: List[int] = []

    captain: str  # 노트: 초깃값이 없습니다!

    class Starship:
        stats: Dict[str, int] = {}

함수 어노테이션과 마찬가지로, 파이썬 인터프리터는 변수 어노테이션에 특별한 의미를 부여하지 않고 클래스나 모듈의 `__annotations__` 어트리뷰트에 저장하기만 합니다.

정적으로 타이핑된 언어의 변수 선언과 달리, 어노테이션 문법의 목표는 추상 구문 트리와 `__annotations__` 어트리뷰트를 통해 제삼자 도구와 라이브러리를 위해 구조화된 형 메타 데이터를 쉽게 지정할 방법을 제공하는 것입니다.

더 보기

PEP 526 – 변수 어노테이션 문법.

  Ryan Gonzalez, Philip House, Ivan Levkivskyi, Lisa Roach 및 Guido van Rossum이 작성한 PEP. Ivan Levkivskyi가 구현했습니다.

새 문법을 사용하거나 사용할 도구: mypy, pytype, PyCharm 등.

### PEP 515: 숫자 리터럴의 밑줄

PEP 515는 가독성을 높이기 위해 숫자 리터럴에 밑줄을 사용하는 기능을 추가합니다. 예를 들면:

    >>> 1_000_000_000_000_000
    1000000000000000
    >>> 0x_FF_FF_FF_FF
    4294967295

숫자 사이와 진수 지정자(base specifier) 뒤에 단일 밑줄이 허용됩니다. 선행, 후행 또는 여러 밑줄이 연속해서 나오는 것은 허용되지 않습니다.

문자열 포매팅 언어는 이제 부동 소수점 표시형과 정수 표시형 `'d'`에 대해 천 단위 구분자에 밑줄 사용을 알리는 `'_'` 옵션을 지원합니다. 정수 표시형 `'b'`, `'o'`, `'x'` 및 `'X'`의 경우, 밑줄이 4자리마다 삽입됩니다:

    >>> '{:_}'.format(1000000)
    '1_000_000'
    >>> '{:_x}'.format(0xFFFFFFFF)
    'ffff_ffff'

더 보기

PEP 515 – 숫자 리터럴의 밑줄

  Georg Brandl과 Serhiy Storchaka가 작성한 PEP.

### PEP 525: 비동기 제너레이터

PEP 492는 파이썬 3.5에 네이티브 코루틴과 `async` / `await` 구문에 대한 지원을 도입했습니다. 파이썬 3.5 구현의 주목할만한 제한은 같은 함수 본문에서 `await`와 `yield`를 사용할 수 없다는 것입니다. 파이썬 3.6에서는 이 제한이 해제되어 비동기 제너레이터(asynchronous generators)를 정의할 수 있습니다:

    async def ticker(delay, to):
        """0 에서 *to* 까지의 숫자를 *delay* 초마다 일드합니다."""
        for i in range(to):
            yield i
            await asyncio.sleep(delay)

새로운 문법은 더 빠르고 간결한 코드를 허용합니다.

더 보기

PEP 525 – 비동기 제너레이터

  Yury Selivanov가 작성하고 구현한 PEP.

### PEP 530: 비동기 컴프리헨션

PEP 530은 리스트, 집합, 딕셔너리 컴프리헨션과 제너레이터 표현식에서 `async for` 사용에 대한 지원을 추가합니다:

    result = [i async for i in aiter() if i % 2]

또한, `await` 표현식은 모든 종류의 컴프리헨션에서 지원됩니다:

    result = [await fun() for fun in funcs if await condition()]

더 보기

PEP 530 – 비동기 컴프리헨션

  Yury Selivanov가 작성하고 구현한 PEP.

### PEP 487: 더 간단한 클래스 생성 사용자 정의

이제 메타 클래스를 사용하지 않고도 서브 클래스 생성을 사용자 정의할 수 있습니다. 새 서브 클래스가 만들어질 때마다 새 `__init_subclass__` 클래스 메서드가 베이스 클래스에서 호출됩니다:

    class PluginBase:
        subclasses = []

        def __init_subclass__(cls, **kwargs):
            super().__init_subclass__(**kwargs)
            cls.subclasses.append(cls)

    class Plugin1(PluginBase):
        pass

    class Plugin2(PluginBase):
        pass

인자가 없는 `super()` 호출이 `__init_subclass__()` 구현에서 올바르게 작동하도록 하기 위해, 사용자 정의 메타 클래스에서 새 `__classcell__` 이름 공간 항목이 `type.__new__`로 전파되도록 해야 합니다 (클래스 객체 만들기에 설명되었듯이).

더 보기

PEP 487 – 더 간단한 클래스 생성 사용자 정의

  Martin Teichmann이 작성하고 구현한 PEP.

기능 설명서

### PEP 487: 디스크립터 프로토콜 향상

PEP 487은 새로운 선택적 `__set_name__()` 메서드를 포함하도록 디스크립터 프로토콜을 확장합니다. 새 클래스가 정의될 때마다, 정의에 포함된 모든 디스크립터에 대해 새 메서드가 호출되어, 정의되는 클래스에 대한 참조와 클래스 이름 공간 내에서 디스크립터에 지정된 이름을 제공합니다. 즉, 디스크립터의 인스턴스는 이제 소유자 클래스에 있는 디스크립터의 어트리뷰트 이름을 알 수 있습니다:

    class IntField:
        def __get__(self, instance, owner):
            return instance.__dict__[self.name]

        def __set__(self, instance, value):
            if not isinstance(value, int):
                raise ValueError(f'expecting integer in {self.name}')
            instance.__dict__[self.name] = value

        # this is the new initializer:
        def __set_name__(self, owner, name):
            self.name = name

    class Model:
        int_field = IntField()

더 보기

PEP 487 – 더 간단한 클래스 생성 사용자 정의

  Martin Teichmann이 작성하고 구현한 PEP.

기능 설명서

### PEP 519: 파일 시스템 경로 프로토콜 추가

파일 시스템 경로는 역사적으로 `str`이나 `bytes` 객체로 표현되었습니다. 이로 인해 파일 시스템 경로에서 작동하는 코드를 작성하는 사람들은 이러한 객체가 두 형 중 하나일 뿐이라고 가정합니다 (파일 기술자를 나타내는 `int`는 파일 경로가 아니기 때문에 고려하지 않습니다). 불행히도 이러한 가정은 `pathlib`와 같은 파일 시스템 경로의 대체 객체 표현이 파이썬의 표준 라이브러리를 포함하여 기존 코드와 함께 작동하지 못하게 합니다.

이 상황을 해결하기 위해, `os.PathLike`으로 표현되는 새 인터페이스가 정의되었습니다. `__fspath__()` 메서드를 구현하면, 객체가 경로를 나타낸다는 신호를 보내는 것입니다. 그런 다음 객체는 파일 시스템 경로의 저수준 표현을 `str`이나 `bytes` 객체로 제공할 수 있습니다. 이것은 `os.PathLike`을 구현하거나 파일 시스템 경로를 나타내는 `str`나 `bytes` 객체면 객체를 경로류로 간주함을 뜻합니다. 코드는 `os.fspath()`, `os.fsdecode()` 또는 `os.fsencode()`를 사용하여 경로류 객체의 `str` 및/또는 `bytes` 표현을 명시적으로 얻을 수 있습니다.

내장 `open()` 함수는 `os`와 `os.path` 모듈의 모든 관련 함수와 표준 라이브러리의 대부분의 다른 함수와 클래스와 마찬가지로, `os.PathLike` 객체를 받아들이도록 갱신되었습니다. `os.DirEntry` 클래스와 `pathlib`의 관련 클래스도 `os.PathLike`을 구현하도록 갱신되었습니다.

기대하는 것은 파일 시스템 경로에서 작동하는 기반 함수들을 갱신하면 코드 변경 없이, 혹은 최소한의 변경만으로도 (예를 들어 경로류 객체에 대한 연산 전에 코드 시작 부분에서 `os.fspath()`를 호출하기), 제삼자 코드가 모든 경로류 객체를 묵시적으로 지원하게 되는 것입니다.

다음은 새 인터페이스를 사용하여 `pathlib.Path`를 기존 코드로보다 쉽고 투명하게 사용할 수 있는 방법에 대한 몇 가지 예입니다:

    >>> import pathlib
    >>> with open(pathlib.Path("README")) as f:
    ...     contents = f.read()
    ...
    >>> import os.path
    >>> os.path.splitext(pathlib.Path("some_file.txt"))
    ('some_file', '.txt')
    >>> os.path.join("/a/b", pathlib.Path("c"))
    '/a/b/c'
    >>> import os
    >>> os.fspath(pathlib.Path("some_file.txt"))
    'some_file.txt'

(Implemented by Brett Cannon, Ethan Furman, Dusty Phillips, and Jelle Zijlstra.)

더 보기

PEP 519 – 파일 시스템 경로 프로토콜 추가

  Brett Cannon과 Koos Zevenhoven이 작성한 PEP.

### PEP 495: 현지 시간 명확성

대부분의 세계 위치에서, 현지 시계가 뒤로 이동하는 시간이 있었고 앞으로도 있을 것입니다. 이 시간에는, 현지 시계가 같은 날에 같은 시간을 두 번 표시하는 간격이 도입되었습니다. 이러한 상황에서, 현지 시계에 표시되는 (또는 파이썬 datetime 인스턴스에 저장된) 정보는 특정 시점을 식별하기에 충분하지 않습니다.

PEP 495는 `datetime.datetime`과 `datetime.time` 클래스의 인스턴스에 새로운 fold 어트리뷰트를 추가하여 현지 시간이 같은 두 순간을 구별합니다:

    >>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
    >>> for i in range(4):
    ...     u = u0 + i*HOUR
    ...     t = u.astimezone(Eastern)
    ...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
    ...
    04:00:00 UTC = 00:00:00 EDT 0
    05:00:00 UTC = 01:00:00 EDT 0
    06:00:00 UTC = 01:00:00 EST 1
    07:00:00 UTC = 02:00:00 EST 0

`fold` 어트리뷰트의 값은 모호한 경우의 두 번째 (시간순으로) 순간을 나타내는 인스턴스를 제외한 모든 인스턴스에 대해 `0` 값을 갖습니다.

더 보기

PEP 495 – 현지 시간 명확성

  Alexander Belopolsky와 Tim Peters가 작성하고 Alexander Belopolsky가 구현한 PEP.

### PEP 529: 윈도우 파일 시스템 인코딩을 UTF-8로 변경

파일 시스템 경로를 나타내는 것은 bytes가 아닌 str(유니코드)로 수행하는 것이 가장 좋습니다. 그러나, bytes 사용이 충분하고 올바른 경우가 있습니다.

파이썬 3.6 이전에는, 윈도우에서 bytes 경로를 사용할 때 데이터 손실이 발생할 수 있습니다. 이 변경으로 인해, 이제 윈도우에서 bytes를 사용하여 경로를 나타내는 것이 지원됩니다. 단, 해당 bytes는 `sys.getfilesystemencoding()`에서 반환한 인코딩으로 인코딩되며, 현재 기본값은 `'utf-8'`입니다.

경로를 나타내기 위해 str을 사용하지 않는 응용 프로그램은 `os.fsencode()`와 `os.fsdecode()`를 사용하여 해당 bytes가 올바르게 인코딩되도록 해야 합니다. 이전 동작으로 되돌리려면, `PYTHONLEGACYWINDOWSFSENCODING`을 설정하거나 `sys._enablelegacywindowsfsencoding()`을 호출하십시오.

필요한 코드 수정에 대한 자세한 정보와 논의는 PEP 529를 참조하십시오.

### PEP 528: 윈도우 콘솔 인코딩을 UTF-8로 변경

윈도우의 기본 콘솔은 이제 모든 유니코드 문자를 허용하고 파이썬 코드에 올바르게 읽힌 str 객체를 제공합니다. `sys.stdin`, `sys.stdout` 및 `sys.stderr`은 이제 utf-8 인코딩으로 기본 설정됩니다.

이 변경은 대화 형 콘솔을 사용할 때만 적용되며, 파일이나 파이프를 리디렉션 할 때는 적용되지 않습니다. 대화식 콘솔 사용 시에 이전 동작으로 되돌리려면, `PYTHONLEGACYWINDOWSSTDIO`를 설정하십시오.

더 보기

PEP 528 – 윈도우 콘솔 인코딩을 UTF-8로 변경

  Steve Dower가 작성하고 구현한 PEP.

### PEP 520: 클래스 어트리뷰트 정의 순서 유지

클래스 정의 본문의 어트리뷰트는 자연스러운 순서를 갖습니다: 이름이 소스에 나타나는 것과 같은 순서. 이 순서는 이제 새 클래스의 `__dict__` 어트리뷰트에 유지됩니다.

또한, 유효한 기본 클래스 실행 이름 공간(type.__prepare__()에서 반환되는 것)은 이제 삽입 순서 보존 매핑입니다.

더 보기

PEP 520 – 클래스 어트리뷰트 정의 순서 유지

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

### PEP 468: 키워드 인자 순서 유지

함수 서명의 `**kwargs`는 이제 삽입 순서 보존 매핑임이 보장됩니다.

더 보기

PEP 468 – 키워드 인자 순서 유지

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

### 새로운 dict 구현

dict 형은 이제 PyPy에서 처음 구현된 Raymond Hettinger의 제안에 기반한 “간결한” 표현을 사용합니다. 새로운 `dict()`의 메모리 사용량은 파이썬 3.5에 비해 20%에서 25% 더 적습니다.

이 새로운 구현의 순서 보존 측면은 구현 세부 사항으로 간주하며 이에 의존해서는 안 됩니다 (향후에 변경될 수 있지만, 현재와 미래의 모든 파이썬 구현에 대해 순서 보존 의미 체계를 의무화하도록 언어 명세를 변경하기 전에 몇 번의 릴리스에서 이 새로운 dict 구현을 언어에 포함하는 것이 바람직합니다; 이것은 또한 무작위 이터레이션 순서가 여전히 유효한 언어의 이전 버전과의 과거 호환성을 유지하는 데 도움이 됩니다, 예를 들어 파이썬 3.5).

(Contributed by INADA Naoki in bpo-27350. 원래 Raymond Hettinger가 제안한 아이디어.)

### PEP 523: CPython에 프레임 평가 API 추가

파이썬은 코드 실행 방법을 사용자 정의하기 위한 광범위한 지원을 제공하지만, 빠진 한 가지는 프레임 객체를 평가하는 것입니다. 파이썬에서 프레임 평가를 가로채는 방법을 원한다면 정의된 함수에 대한 함수 포인터를 직접 조작하지 않고는 방법이 없었습니다.

PEP 523은 프레임 평가를 C 수준에서 끼워 넣을 수 있도록 하는 API를 제공하여 이를 바꿉니다. 이를 통해 디버거와 JIT과 같은 도구가 파이썬 코드 실행이 시작되기 전에 프레임 평가를 가로챌 수 있습니다. 이를 통해 파이썬 코드의 대체 평가 구현, 추적 프레임 평가 등이 가능해집니다.

이 API는 제한된 C API의 일부가 아니며 이 API의 사용이 제한적일 것으로 기대하고, 매우 선별된 저수준 사용 사례에만 적용 가능함을 알리기 위해 비공개로 표시됩니다. API의 의미는 필요에 따라 파이썬과 함께 변경됩니다.

더 보기

PEP 523 – CPython에 프레임 평가 API 추가

  Brett Cannon과 Dino Viehland가 작성한 PEP.

### PYTHONMALLOC 환경 변수

새로운 `PYTHONMALLOC` 환경 변수를 사용하면 파이썬 메모리 할당자를 설정하고 디버그 훅을 설치할 수 있습니다.

이제 `PYTHONMALLOC=debug`를 사용하여 릴리스 모드로 컴파일된 파이썬의 파이썬 메모리 할당자에 디버그 훅을 설치할 수 있습니다. 디버그 훅의 효과:

- 새로 할당된 메모리는 `0xCB` 바이트로 채워집니다

- 해제된 메모리는 `0xDB` 바이트로 채워집니다

- 파이썬 메모리 할당자 API 위반을 감지합니다. 예를 들어, `PyMem_Malloc()`에 의해 할당된 메모리 블록에 대해 호출된 `PyObject_Free()`.

- 버퍼 시작 앞에 쓰기를 감지합니다 (버퍼 언더플로)

- 버퍼 끝 뒤에 쓰기를 감지합니다 (버퍼 오버플로)

- `PYMEM_DOMAIN_OBJ`(예: `PyObject_Malloc()`)와 `PYMEM_DOMAIN_MEM`(예: `PyMem_Malloc()`) 도메인의 할당자 함수가 호출될 때 GIL을 잡았는지 확인합니다.

GIL을 잡았는지 확인하는 것도 파이썬 3.6의 새로운 기능입니다.

파이썬 메모리 할당자에 대한 디버그 훅은 `PyMem_SetupDebugHooks()` 함수를 참조하십시오.

이제 `PYTHONMALLOC=malloc`을 사용해서 모든 파이썬 메모리 할당에 대해 C 라이브러리의 `malloc()` 할당자를 강제로 사용하게 할 수도 있습니다. 이것은 릴리스 모드로 컴파일된 파이썬에 Valgrind와 같은 외부 메모리 디버거를 사용할 때 유용합니다.

에러 시, 파이썬 메모리 할당자의 디버그 훅은 이제 `tracemalloc` 모듈을 사용하여 메모리 블록이 할당된 트레이스백을 가져옵니다.

`python3.6 -X tracemalloc=5`(트레이스에 5개 프레임을 저장합니다)를 사용하는 버퍼 오버플로로 인한 치명적인 에러의 예:

    Debug memory block at address p=0x7fbcd41666f8: API 'o'
        4 bytes originally requested
        The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
        The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
            at tail+0: 0x02 *** OUCH
            at tail+1: 0xfb
            at tail+2: 0xfb
            at tail+3: 0xfb
            at tail+4: 0xfb
            at tail+5: 0xfb
            at tail+6: 0xfb
            at tail+7: 0xfb
        The block was made by call #1233329 to debug malloc/realloc.
        Data at p: 1a 2b 30 00

    Memory block allocated at (most recent call first):
      File "test/test_bytes.py", line 323
      File "unittest/case.py", line 600
      File "unittest/case.py", line 648
      File "unittest/suite.py", line 122
      File "unittest/suite.py", line 84

    Fatal Python error: bad trailing pad byte

    Current thread 0x00007fbcdbd32700 (most recent call first):
      File "test/test_bytes.py", line 323 in test_hex
      File "unittest/case.py", line 600 in run
      File "unittest/case.py", line 648 in __call__
      File "unittest/suite.py", line 122 in run
      File "unittest/suite.py", line 84 in __call__
      File "unittest/suite.py", line 122 in run
      File "unittest/suite.py", line 84 in __call__
      ...

(Contributed by Victor Stinner in bpo-26516 and bpo-26564.)

### DTrace와 SystemTap 프로브 지원

이제 파이썬은 인터프리터에서 다음 이벤트에 대한 정적 마커를 활성화하는 `--with-dtrace`로 빌드 할 수 있습니다:

- 함수 호출/반환

- 가비지 수거 시작/완료

- 실행된 코드 줄.

이것은 특정 디버그 빌드를 다시 컴파일하거나 응용 프로그램별 프로파일링/디버깅 코드를 제공할 필요 없이, 프로덕션에서 실행 중인 인터프리터를 계측하는 데 사용할 수 있습니다.

자세한 내용은 DTrace와 SystemTap으로 CPython 계측하기에 있습니다.

현재 구현은 리눅스와 macOS에서 테스트되었습니다. 향후 추가 마커가 추가될 수 있습니다.

(Contributed by Łukasz Langa in bpo-21590, based on patches by Jesús Cea Avión, David Malcolm, and Nikhil Benesch.)

## 기타 언어 변경

핵심 파이썬 언어에 대한 몇 가지 작은 변경 사항은 다음과 같습니다:

- `global`이나 `nonlocal` 문은 이제 같은 스코프에서 영향을 받는 이름을 처음 사용하기 전에 텍스트로 나타나야 합니다. 이전에는 `SyntaxWarning`이었습니다.

- 이제 해당 연산을 사용할 수 없음을 나타내기 위해 특수 메서드를 `None`으로 설정할 수 있습니다. 예를 들어, 클래스가 `__iter__()`를 `None`으로 설정하면, 해당 클래스는 이터러블이 아닙니다. (Contributed by Andrew Barnert and Ivan Levkivskyi in bpo-25958.)

- 반복되는 트레이스백 줄의 긴 시퀀스는 이제 `"[Previous line repeated {count} more times]"`로 축약됩니다 (예는 traceback 을 참조하십시오). (Contributed by Emanuel Barry in bpo-26823.)

- 임포트는 이제 모듈을 찾을 수 없을 때 새로운 예외 `ModuleNotFoundError`(`ImportError`의 서브 클래스)를 발생시킵니다. 현재 (try-except에서) ImportError를 확인하는 코드는 계속 작동합니다. (Contributed by Eric Snow in bpo-15767.)

- 인자가 없는 `super()`에 의존하는 클래스 메서드는 이제 클래스 생성 중에 메타 클래스 메서드에서 호출될 때 올바르게 작동합니다. (Contributed by Martin Teichmann in bpo-23722.)

## 새로운 모듈

### secrets

새로운 `secrets` 모듈의 주요 목적은 계정 인증, 토큰 등과 같은 비밀 관리에 적합한 암호학적으로 강력한 의사 난수 값을 신뢰성 있게 생성할 수 있는 확실한 방법을 제공하는 것입니다.

경고

`random` 모듈의 의사 난수 생성기는 보안 목적으로 사용하지 않아야 합니다. 파이썬 3.6 이상에서는 `secrets`를 사용하고 파이썬 3.5와 이전 버전에서는 `os.urandom()`을 사용하십시오.

더 보기

PEP 506 – 표준 라이브러리에 비밀 모듈 추가

  Steven D’Aprano 가 작성하고 구현한 PEP.

## 개선된 모듈

### array

`array.array`의 소진된 이터레이터는 이제 이터레이트 되는 배열이 확장된 경우에도 소진된 상태로 유지됩니다. 이것은 다른 가변 시퀀스의 동작과 일치합니다.

Contributed by Serhiy Storchaka in bpo-26492.

### ast

새로운 `ast.Constant` AST 노드가 추가되었습니다. 상수 폴딩을 위해 외부 AST 최적화기에서 사용할 수 있습니다.

Contributed by Victor Stinner in bpo-26146.

### asyncio

파이썬 3.6부터 `asyncio` 모듈은 더는 잠정적이 아니며 해당 API는 안정적인 것으로 간주합니다.

파이썬 3.5.0 이후 `asyncio` 모듈의 주목할만한 변경 사항 (잠정적 상태로 인해 모두 3.5.x로 역 이식되었습니다):

- `get_event_loop()` 함수는 코루틴과 콜백에서 호출될 때 항상 현재 실행 중인 루프를 반환하도록 변경되었습니다. (Contributed by Yury Selivanov in bpo-28613.)

- `ensure_future()` 함수와 이를 사용하는 모든 함수(가령 `loop.run_until_complete()`)는 이제 모든 종류의 어웨이터블 객체를 받아들입니다. (Contributed by Yury Selivanov.)

- 다른 스레드의 이벤트 루프에 코루틴을 제출하는 새로운 `run_coroutine_threadsafe()` 함수. (Contributed by Vincent Michel.)

- 트랜스포트가 닫히고 있거나 닫혔는지 확인하는 새로운 `Transport.is_closing()` 메서드. (Contributed by Yury Selivanov.)

- `loop.create_server()` 메서드는 이제 호스트 리스트를 받아들일 수 있습니다. (Contributed by Yann Sionneau.)

- Future 객체를 만드는 새로운 `loop.create_future()` 메서드. 이를 통해 uvloop와 같은 대체 이벤트 루프 구현이 더 빠른 `asyncio.Future` 구현을 제공할 수 있습니다. (Contributed by Yury Selivanov in bpo-27041.)

- 현재 예외 처리기를 가져오는 새로운 `loop.get_exception_handler()` 메서드. (Contributed by Yury Selivanov in bpo-27040.)

- 구분자 바이트 시퀀스가 나타날 때까지 스트림에서 데이터를 읽는 새로운 `StreamReader.readuntil()` 메서드. (Contributed by Mark Korenberg.)

- `StreamReader.readexactly()`의 성능이 향상되었습니다. (Contributed by Mark Korenberg in bpo-28370.)

- `loop.getaddrinfo()` 메서드는 주소가 이미 결정되었으면 시스템 `getaddrinfo` 함수를 호출하지 않도록 최적화되었습니다. (Contributed by A. Jesse Jiryu Davis.)

- 현재 이터레이션 직후 루프를 중지하도록 `loop.stop()` 메서드가 변경되었습니다. 마지막 이터레이션의 결과로 예약된 모든 새 콜백은 버려집니다. (Contributed by Guido van Rossum in bpo-25593.)

- `Future.set_exception`은 이제 `StopIteration` 예외의 인스턴스가 전달될 때 `TypeError`를 발생시킵니다. (Contributed by Chris Angelico in bpo-26221.)

- asyncio 외부의 연결을 받아들이지만 이를 처리하기 위해 asyncio를 사용하는 서버에서 사용할 새로운 `loop.connect_accepted_socket()` 메서드. (Contributed by Jim Fulton in bpo-27392.)

- `TCP_NODELAY` 플래그는 이제 기본적으로 모든 TCP 트랜스포트에 대해 설정됩니다. (Contributed by Yury Selivanov in bpo-27456.)

- 루프를 닫기 전에 계류 중인 비동기 제너레이터를 제대로 닫는 새로운 `loop.shutdown_asyncgens()`. (Contributed by Yury Selivanov in bpo-28003.)

- `Future`와 `Task` 클래스는 이제 asyncio 코드를 최대 30% 더 빠르게 만드는 최적화된 C 구현을 갖습니다. (Contributed by Yury Selivanov and INADA Naoki in bpo-26081 and bpo-28544.)

### Binascii

`b2a_base64()` 함수는 이제 반환 값에 줄 넘김 문자를 추가할지를 제어하기 위해 선택적 newline 키워드 인자를 받아들입니다. (Contributed by Victor Stinner in bpo-25357.)

### cmath

새로운 `cmath.tau` (τ) 상수가 추가되었습니다. (Contributed by Lisa Roach in bpo-12345, see PEP 628 for details.)

새로운 상수: `math.inf`와 `math.nan`과 일치하는 `cmath.inf`와 `cmath.nan`, 그리고 복소수 repr에서 사용하는 형식과 일치하는 `cmath.infj`와 `cmath.nanj`. (Contributed by Mark Dickinson in bpo-23229.)

### collections

새로운 `Collection` 추상 베이스 클래스가 추가되어 길이가 있는 이터러블 컨테이너 클래스를 나타냅니다. (Contributed by Ivan Levkivskyi, docs by Neil Girdhar in bpo-27598.)

새로운 `Reversible` 추상 베이스 클래스는 `__reversed__()` 메서드도 제공하는 이터러블 클래스를 나타냅니다. (Contributed by Ivan Levkivskyi in bpo-25987.)

새로운 `AsyncGenerator` 추상 베이스 클래스는 비동기 제너레이터를 나타냅니다. (Contributed by Yury Selivanov in bpo-28720.)

`namedtuple()` 함수는 이제 지정되면 반환된 네임드 튜플 클래스의 `__module__` 어트리뷰트에 사용되는 선택적 키워드 인자 module을 받아들입니다. (Contributed by Raymond Hettinger in bpo-17941.)

`namedtuple()`에 대한 verbose와 rename 인자는 이제 키워드 전용입니다. (Contributed by Raymond Hettinger in bpo-25628.)

이제 재귀 `collections.deque` 인스턴스를 피클 할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-26482.)

### concurrent.futures

`ThreadPoolExecutor` 클래스 생성자는 이제 선택적 thread_name_prefix 인자를 받아들여 풀이 만든 스레드의 이름을 사용자 정의할 수 있습니다. (Contributed by Gregory P. Smith in bpo-27664.)

### contextlib

컨텍스트 관리자를 위한 추상 베이스 클래스를 제공하기 위해 `contextlib.AbstractContextManager` 클래스가 추가되었습니다. `self`를 반환하는 `__exit__()`의 합리적인 기본 구현을 제공하고 `__enter__()`는 추상 메서드로 남겨 둡니다. 일치하는 클래스가 `typing` 모듈에 `typing.ContextManager`로 추가되었습니다. (Contributed by Brett Cannon in bpo-25609.)

### datetime

`datetime`과 `time` 클래스에는 필요할 때 현지 시간을 명확히 하는 데 사용되는 새로운 `fold` 어트리뷰트를 갖습니다. `datetime`의 많은 함수가 현지 시간 명확성을 지원하도록 갱신되었습니다. 자세한 내용은 현지 시간 명확성 섹션을 참조하십시오. (Contributed by Alexander Belopolsky in bpo-24773.)

`datetime.strftime()`과 `date.strftime()` 메서드는 이제 ISO 8601 날짜 지시자 `%G`, `%u` 및 `%V`를 지원합니다. (Contributed by Ashley Anderson in bpo-12006.)

`datetime.isoformat()` 함수는 이제 포함할 시간 값의 추가 구성 요소 수를 지정하는 선택적 timespec 인자를 받아들입니다. (Contributed by Alessandro Cucci and Alexander Belopolsky in bpo-19475.)

`datetime.combine()`은 이제 선택적 tzinfo 인자를 받아들입니다. (Contributed by Alexander Belopolsky in bpo-27661.)

### decimal

주어진 `Decimal` 인스턴스를 분수로 표현하는 정수 쌍 `(n, d)`를 가장 작은 항과 양의 분모로 반환하는 새로운 `Decimal.as_integer_ratio()` 메서드:

    >>> Decimal('-3.14').as_integer_ratio()
    (-157, 50)

(Contributed by Stefan Krah amd Mark Dickinson in bpo-25928.)

### distutils

`default_format` 어트리뷰트는 `distutils.command.sdist.sdist`에서 제거되었으며 `formats` 어트리뷰트의 기본값은 `['gztar']`입니다. 예상되지는 않지만, `default_format`의 존재에 의존하는 모든 코드를 조정해야 할 수 있습니다. 자세한 내용은 bpo-27819를 참조하십시오.

### email

다양한 생성자에 대한 policy 키워드를 통해 활성화되는 새 이메일 API는 더는 잠정적이 아닙니다. `email` 설명서는 레거시 API에 대한 이전 설명서를 유지하면서 새 API에 초점을 맞추기 위해 재구성되고 재작성되었습니다. (Contributed by R. David Murray in bpo-24277.)

이제 `email.mime` 클래스는 모두 선택적 policy 키워드를 받아들입니다. (Contributed by Berker Peksag in bpo-27331.)

`DecodedGenerator`는 이제 policy 키워드를 지원합니다.

구문 분석기가 새 메시지 객체를 만들 때 기본적으로 사용되는 클래스를 제어하는, 새 `policy` 어트리뷰트 `message_factory`가 있습니다. `email.policy.compat32` 정책의 경우 `Message`이고, 새 정책의 경우 `EmailMessage`입니다. (Contributed by R. David Murray in bpo-20476.)

### encodings

윈도우에서, `CP_OEMCP`를 사용하는 `'oem'` 인코딩을 추가하고, `CP_ACP` 코드 페이지를 사용하는 기존 `'mbcs'` 인코딩을 위한 `'ansi'` 별칭을 추가했습니다. (Contributed by Steve Dower in bpo-27959.)

### enum

`enum` 모듈에 `Flag`와 `IntFlags`라는 두 개의 새로운 열거 베이스 클래스가 추가되었습니다. 둘 다 비트별 연산자를 사용하여 결합할 수 있는 상수를 정의하는 데 사용됩니다. (Contributed by Ethan Furman in bpo-23591.)

상수에 `IntFlags` 클래스를 사용하도록 많은 표준 라이브러리 모듈이 갱신되었습니다.

새 `enum.auto` 값을 사용하여 값을 열거형 멤버에 자동으로 할당할 수 있습니다:

    >>> from enum import Enum, auto
    >>> class Color(Enum):
    ...     red = auto()
    ...     blue = auto()
    ...     green = auto()
    ...
    >>> list(Color)
    [<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]

### faulthandler

윈도우에서, `faulthandler` 모듈은 이제 윈도우 예외에 대한 처리기를 설치합니다: `faulthandler.enable()`을 참조하십시오. (Contributed by Victor Stinner in bpo-23848.)

### fileinput

`hook_encoded()`는 이제 errors 인자를 지원합니다. (Contributed by Joseph Hackman in bpo-25788.)

### hashlib

`hashlib`는 OpenSSL 1.1.0을 지원합니다. 최소 권장 버전은 1.0.2입니다. (Contributed by Christian Heimes in bpo-26470.)

BLAKE2 해시 함수가 모듈에 추가되었습니다. `blake2b()`와 `blake2s()`는 항상 사용할 수 있으며 BLAKE2의 전체 기능 집합을 지원합니다. (Contributed by Christian Heimes in bpo-26798 based on code by Dmitry Chestnykh and Samuel Neves. Documentation written by Dmitry Chestnykh.)

SHA-3 해시 함수 `sha3_224()`, `sha3_256()`, `sha3_384()`, `sha3_512()` 및 SHAKE 해시 함수 `shake_128()`과 `shake_256()`이 추가되었습니다. (Contributed by Christian Heimes in bpo-16113. Keccak Code Package by Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche, and Ronny Van Keer.)

비밀번호 기반 키 파생 함수 `scrypt()`는 이제 OpenSSL 1.1.0 이상에서 사용할 수 있습니다. (Contributed by Christian Heimes in bpo-27928.)

### http.client

`HTTPConnection.request()`와 `endheaders()` 모두 이제 청크 인코딩(chunked encoding) 요청 본문을 지원합니다. (Contributed by Demian Brecht and Rolf Krahl in bpo-12319.)

### idlelib와 IDLE

idlelib 패키지는 IDLE의 모양과 작동을 개선하고 코드를 더 쉽게 이해하고, 테스트하고 개선할 수 있도록 현대화와 리팩토링 되고 있습니다. 특히 리눅스와 맥에서 IDLE을 더 보기 좋게 만드는 부분은 대부분 대화 상자에서 ttk 위젯을 사용하는 것입니다. 결과적으로, IDLE은 더는 tcl/tk 8.4에서 실행되지 않습니다. 이제 tcl/tk 8.5나 8.6이 필요합니다. 둘 중 어느 것이든 최신 릴리스를 실행하는 것이 좋습니다.

‘현대화’에는 idlelib 모듈의 이름 변경과 통합이 포함됩니다. 부분 대문자 이름을 가진 파일의 이름을 바꾸는 것은, 예를 들어 3.0에서 Tkinter와 TkFont를 tkinter와 tkinter.font로 이름을 바꾸는 것과 유사합니다. 결과적으로, 3.5에서 작동했던 idlelib 파일 임포트는 일반적으로 3.6에서 작동하지 않습니다. 최소한 모듈 이름 변경이 필요합니다 (idlelib/README.txt를 참조하십시오). (bpo-24225에서 Al Swiegart와 Terry Reedy에 의해 이름이 변경되었습니다. 이후 대부분의 idlelib 패치는 프로세스의 일부였고 앞으로도 그럴 것입니다.)

이에 대한 보상으로, 결과적으로 일부 idlelib 클래스는 더 나은 API와 그를 설명하는 독스트링을 통해 더 쉽게 사용할 수 있습니다. 사용할 수 있으면 추가 유용한 정보가 idlelib에 추가될 것입니다.

3.6.2의 새로운 기능:

자동 완성에 대한 여러 수정. (Contributed by Louie Lu in bpo-15786.)

3.6.3의 새로운 기능:

모듈 브라우저(File 메뉴에 있는, 예전에는 클래스 브라우저라고 했습니다)는 이제 최상위 함수와 클래스 외에도 중첩된 함수와 클래스를 표시합니다. (Contributed by Guilherme Polo, Cheryl Sabella, and Terry Jan Reedy in bpo-1612262.)

이전에 확장으로 구현된 IDLE 기능은 일반 기능으로 다시 구현되었습니다. 설정이 Extension 탭에서 다른 대화 상자 탭으로 이동되었습니다. (Contributed by Charles Wohlganger and Terry Jan Reedy in bpo-27099.)

설정 대화 상자(Options, Configure IDLE)가 부분적으로 다시 작성되어 모양과 기능이 모두 향상되었습니다. (Contributed by Cheryl Sabella and Terry Jan Reedy in multiple issues.)

3.6.4의 새로운 기능:

이제 글꼴 샘플에는 사용자가 특정 글꼴 선택의 효과를 더 잘 볼 수 있도록 비 라틴 문자 선택이 포함됩니다. (Contributed by Terry Jan Reedy in bpo-13802.) 샘플은 다른 문자를 포함하도록 편집 할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-31860.)

3.6.6의 새로운 기능:

편집기 코드 컨텍스트 옵션이 수정되었습니다. 상자는 최대 maxlines까지 모든 컨텍스트 줄을 표시합니다. 컨텍스트 줄을 클릭하면 편집기가 해당 줄로 이동합니다. 사용자 정의 테마의 컨텍스트 색상이 Settings 대화 상자의 Highlights 탭에 추가되었습니다. (Contributed by Cheryl Sabella and Terry Jan Reedy in bpo-33642, bpo-33768, and bpo-33679.)

윈도우에서, 새로운 API 호출은 tk가 DPI에 맞게 확장됨을 윈도우에 알립니다. 윈도우 8.1 이상이나 10에서, 파이썬 바이너리의 DPI 호환성 속성이 변경되지 않고, 96 DPI보다 큰 모니터 해상도를 사용하면, 텍스트와 선이 더 선명해져야 합니다. 그렇지 않으면 효과가 없습니다. (Contributed by Terry Jan Reedy in bpo-33656.)

3.6.7의 새로운 기능:

N 줄 (기본값은 50) 이상의 출력은 버튼으로 압착됩니다. N은 Settings 대화 상자의 General 페이지에 있는 PyShell 섹션에서 변경할 수 있습니다. 더 적은 (하지만 더 길 수는 있는) 줄은 출력을 마우스 오른쪽 버튼으로 클릭하여 압착할 수 있습니다. 압착된 출력은 버튼을 더블 클릭하여 제자리에서 확장하거나 마우스 오른쪽 버튼으로 버튼을 클릭하여 클립 보드나 별도의 창으로 확장 할 수 있습니다. (Contributed by Tal Einat in bpo-1529353.)

### importlib

임포트는 이제 모듈을 찾을 수 없을 때 새로운 예외 `ModuleNotFoundError`(`ImportError`의 서브 클래스)를 발생시킵니다. 현재 (try-except에서) `ImportError`를 검사하는 코드는 계속 작동합니다. (Contributed by Eric Snow in bpo-15767.)

`importlib.util.LazyLoader`는 이제 래핑 된 로더에서 `create_module()`을 호출하여, `importlib.machinery.BuiltinImporter`와 `importlib.machinery.ExtensionFileLoader`를 `importlib.util.LazyLoader`와 함께 사용할 수 없는 제한을 제거합니다.

`importlib.util.cache_from_source()`, `importlib.util.source_from_cache()` 및 `importlib.util.spec_from_file_location()`은 이제 경로류 객체를 받아들입니다.

### inspect

`inspect.signature()` 함수는 이제 컴프리헨션과 제너레이터 표현식 스코프에 대해 컴파일러가 생성한 묵시적 `.0` 매개 변수를 `implicit0`이라는 위치 전용 매개 변수인 것처럼 보고합니다. (Contributed by Jelle Zijlstra in bpo-19611.)

파이썬 2.7과 레거시 `inspect.getargspec()` API에서 업그레이드할 때 코드 변동을 줄이기 위해, 이전에 문서화된 `inspect.getfullargspec()` 의 폐지가 취소되었습니다. 이 함수는 단일/소스 파이썬 2/3 코드 베이스에 편리하지만, 더 풍부한 `inspect.signature()` 인터페이스는 새 코드에 권장되는 접근 방식으로 남아 있습니다. (Contributed by Nick Coghlan in bpo-27172)

### json

`json.load()`와 `json.loads()`는 이제 바이너리 입력을 지원합니다. 인코딩된 JSON은 UTF-8, UTF-16 또는 UTF-32를 사용하여 표현해야 합니다. (Contributed by Serhiy Storchaka in bpo-17909.)

### logging

새로운 `WatchedFileHandler.reopenIfNeeded()` 메서드가 추가되어 로그 파일을 다시 열어야 하는지 확인하는 기능이 추가되었습니다. (Contributed by Marian Horban in bpo-24884.)

### math

tau (τ) 상수가 `math`와 `cmath` 모듈에 추가되었습니다. (Contributed by Lisa Roach in bpo-12345, see PEP 628 for details.)

### multiprocessing

`multiprocessing.Manager()`에서 반환된 프락시 객체는 이제 중첩될 수 있습니다. (Contributed by Davin Potts in bpo-6766.)

### os

`os`와 `os.path` 모듈이 이제 경로류 객체를 지원하는 방법에 대한 자세한 내용은 PEP 519 요약을 참조하십시오.

`scandir()`은 이제 윈도우에서 `bytes` 경로를 지원합니다.

새로운 `close()` 메서드를 사용하면 `scandir()` 이터레이터를 명시적으로 닫을 수 있습니다. `scandir()` 이터레이터는 이제 컨텍스트 관리자 프로토콜을 지원합니다. `scandir()` 이터레이터가 소진되지도 않고 명시적으로 닫히지도 않으면 `ResourceWarning`이 파괴자에서 방출됩니다. (Contributed by Serhiy Storchaka in bpo-25994.)

리눅스에서, `os.urandom()`은 이제 보안을 강화하기 위해 시스템 urandom 엔트로피 풀이 초기화될 때까지 블록합니다. 근거는 PEP 524를 참조하십시오.

리눅스 `getrandom()` 시스템 호출(무작위 바이트 얻기)이 이제 새로운 `os.getrandom()` 함수로 노출됩니다. (Contributed by Victor Stinner, part of the PEP 524)

### pathlib

`pathlib`는 이제 경로류 객체를 지원합니다. (Contributed by Brett Cannon in bpo-27186.)

자세한 내용은 PEP 519 요약을 참조하십시오.

### pdb

`Pdb` 클래스 생성자에는 `.pdbrc` 파일을 읽어야 하는지를 제어하는 새로운 선택적 readrc 인자가 있습니다.

### pickle

키워드 인자로 호출된 `__new__`가 필요한 객체는 이제 프로토콜 버전 4보다 오래된 피클 프로토콜을 사용하여 피클 할 수 있습니다. 프로토콜 버전 4는 이미 이 경우를 지원합니다. (Contributed by Serhiy Storchaka in bpo-24164.)

### pickletools

`pickletools.dis()`는 이제 `MEMOIZE` 옵코드를 위한 묵시적 메모 인덱스를 출력합니다. (Contributed by Serhiy Storchaka in bpo-25382.)

### pydoc

`pydoc` 모듈은 `MANPAGER` 환경 변수를 존중하는 법을 배웠습니다. (Contributed by Matthias Klose in bpo-8637.)

`help()`와 `pydoc`은 이제 사전 순이 아닌 정의된 순서대로 네임드 튜플 필드를 나열할 수 있습니다. (Contributed by Raymond Hettinger in bpo-24879.)

### random

새로운 `choices()` 함수는 선택적 가중치(weights)를 사용하여 주어진 모집단에서 지정된 크기의 요소 리스트를 반환합니다. (Contributed by Raymond Hettinger in bpo-18844.)

### re

정규식에서 수정자 범위 지원이 추가되었습니다. 예: `'(?i:p)ython'`은 `'python'`과 `'Python'`과 일치하지만, `'PYTHON'`은 일치하지 않습니다; `'(?i)g(?-i:v)r'`는 `'GvR'`과 `'gvr'`과 일치하지만, `'GVR'`은 일치하지 않습니다. (Contributed by Serhiy Storchaka in bpo-433028.)

Match 객체 그룹은 `group()`과 동등한 `__getitem__`으로 액세스 할 수 있습니다. 따라서 `mo['name']`은 이제 `mo.group('name')`과 동등합니다. (Contributed by Eric Smith in bpo-24454.)

`Match` 객체는 이제 `인덱스류 객체`를 그룹 인덱스로 지원합니다. (Contributed by Jeroen Demeyer and Xiang Zhang in bpo-27177.)

### readline

히스토리 리스트에 자동 입력 추가를 활성화하거나 비활성화하는 `set_auto_history()`를 추가했습니다. (Contributed by Tyler Crompton in bpo-26870.)

### rlcompleter

접두사가 밑줄로 시작하지 않는 한 비공개와 특수 어트리뷰트 이름은 이제 생략됩니다. 일부 완성된 키워드 뒤에 스페이스나 콜론이 추가됩니다. (Contributed by Serhiy Storchaka in bpo-25011 and bpo-25209.)

### shlex

`shlex`는 구두점으로 처리되는 문자를 제어하기 위한 새로운 punctuation_chars 인자를 통해 훨씬 개선된 셸 호환성을 갖습니다. (Contributed by Vinay Sajip in bpo-1521950.)

### site

`.pth` 파일에서 `sys.path`에 추가할 경로를 지정할 때, 이제 디렉터리 위에 파일 경로를 지정할 수 있습니다 (예를 들어 zip 파일). (Contributed by Wolfgang Langner in bpo-26587).

### sqlite3

`sqlite3.Cursor.lastrowid`는 이제 `REPLACE` 문을 지원합니다. (Contributed by Alex LordThorsen in bpo-16864.)

### socket

`ioctl()` 함수는 이제 `SIO_LOOPBACK_FAST_PATH` 제어 코드를 지원합니다. (Contributed by Daniel Stokes in bpo-26536.)

`getsockopt()` 상수 `SO_DOMAIN`, `SO_PROTOCOL`, `SO_PEERSEC` 및 `SO_PASSSEC`이 이제 지원됩니다. (Contributed by Christian Heimes in bpo-26907.)

`setsockopt()`는 이제 `setsockopt(level, optname, None, optlen: int)` 형식을 지원합니다. (Contributed by Christian Heimes in bpo-27744.)

socket 모듈은 이제 리눅스 커널 암호화 API와 인터페이스 하기 위해 주소 패밀리 `AF_ALG`를 지원합니다. `ALG_*`, `SOL_ALG` 및 `sendmsg_afalg()`가 추가되었습니다. (Contributed by Christian Heimes in bpo-27744 with support from Victor Stinner.)

새로운 리눅스 상수 `TCP_USER_TIMEOUT`과 `TCP_CONGESTION`이 추가되었습니다. (Contributed by Omar Sandoval, bpo-26273).

### socketserver

`http.server`, `xmlrpc.server` 및 `wsgiref.simple_server`에 정의된 것들을 포함하여, `socketserver` 모듈에 기반하는 서버는 이제 컨텍스트 관리자 프로토콜을 지원합니다. (Contributed by Aviv Palivoda in bpo-26404.)

`StreamRequestHandler` 클래스의 `wfile` 어트리뷰트는 이제 `io.BufferedIOBase` 쓰기 가능한 인터페이스를 구현합니다. 특히 `write()`를 호출하면 이제 데이터 전체를 보냄이 보장됩니다. (Contributed by Martin Panter in bpo-26721.)

### ssl

`ssl`은 OpenSSL 1.1.0을 지원합니다. 최소 권장 버전은 1.0.2입니다. (Contributed by Christian Heimes in bpo-26470.)

3DES는 기본 암호 스위트에서 제거되었으며 ChaCha20 Poly1305 암호 스위트가 추가되었습니다. (Contributed by Christian Heimes in bpo-27850 and bpo-27766.)

`SSLContext`는 옵션과 암호에 대해 더 나은 기본 구성을 제공합니다. (Contributed by Christian Heimes in bpo-28043.)

SSL 세션은 새로운 `SSLSession` 클래스를 사용하여, 한 클라이언트 측 연결에서 다른 연결로 복사 할 수 있습니다. TLS 세션 재개는 초기 핸드 셰이크 속도를 높이고, 지연 시간을 줄이며 성능을 향상할 수 있습니다 (Contributed by Christian Heimes in bpo-19500 based on a draft by Alex Warhawk.)

새로운 `get_ciphers()` 메서드를 사용하여 암호 우선순위에 따라 활성화된 암호 리스트를 가져올 수 있습니다.

모든 상수와 플래그가 `IntEnum`과 `IntFlags`로 변환되었습니다. (Contributed by Christian Heimes in bpo-28025.)

`SSLContext`를 위한 서버와 클라이언트 측 특정 TLS 프로토콜이 추가되었습니다. (Contributed by Christian Heimes in bpo-28085.)

Added `ssl.SSLContext.post_handshake_auth` to enable and `ssl.SSLSocket.verify_client_post_handshake()` to initiate TLS 1.3 post-handshake authentication. (Contributed by Christian Heimes in gh-78851.)

### statistics

새로운 `harmonic_mean()` 함수가 추가되었습니다. (Contributed by Steven D’Aprano in bpo-27181.)

### struct

`struct`는 이제 `'e'` 포맷 지정자를 통해 IEEE 754 반 정밀도 부동 소수점을 지원합니다. (Contributed by Eli Stevens, Mark Dickinson in bpo-11734.)

### subprocess

`subprocess.Popen` 파괴자는 이제 자식 프로세스가 계속 실행 중이면 `ResourceWarning` 경고를 내보냅니다. 자식 프로세스의 종료 상태를 읽으려면, 컨텍스트 관리자 프로토콜(`with proc: ...`)을 사용하거나 `wait()` 메서드를 명시적으로 호출하십시오. (Contributed by Victor Stinner in bpo-26741.)

`subprocess.Popen` 생성자와 그것을 통해 인자를 전달하는 모든 함수는 이제 encoding과 errors 인자를 받아들입니다. 이들 중 하나를 지정하면 stdin, stdout 및 stderr 스트림에 대한 텍스트 모드가 활성화됩니다. (Contributed by Steve Dower in bpo-6135.)

### sys

새로운 `getfilesystemencodeerrors()` 함수는 유니코드 파일명과 바이트열 파일명 사이를 변환하는 데 사용되는 에러 모드의 이름을 반환합니다. (Contributed by Steve Dower in bpo-27781.)

윈도우에서 `getwindowsversion()` 함수의 반환 값에는 이제 프로세스에 대해 에뮬레이션 되는 버전이 아니라 현재 운영 체제의 정확한 주 버전, 부 버전 및 빌드 번호가 포함된 platform_version 필드가 포함됩니다 (Contributed by Steve Dower in bpo-27932.)

### telnetlib

`telnetlib.Telnet`은 이제 컨텍스트 관리자입니다 (contributed by Stéphane Wirtel in bpo-25485).

### time

`struct_time` 어트리뷰트 `tm_gmtoff`와 `tm_zone`은 이제 모든 플랫폼에서 사용할 수 있습니다.

### timeit

총 실행 시간이 200밀리초 이상이 되도록 `Timer.timeit()`을 반복적으로 호출하는 새로운 `Timer.autorange()` 편의 메서드가 추가되었습니다. (Contributed by Steven D’Aprano in bpo-6422.)

`timeit`은 이제 최상과 최악 시간 사이에 상당한 (4x) 차이가 있을 때 경고합니다. (Contributed by Serhiy Storchaka in bpo-23552.)

### tkinter

`tkinter.Variable` 클래스에 `trace_add()`, `trace_remove()` 및 `trace_info()` 메서드를 추가했습니다. 오래된 Tcl 명령을 사용하는 이전 메서드 `trace_variable()`, `trace()`, `trace_vdelete()` 및 `trace_vinfo()`를 대체하며 Tcl의 향후 버전에서는 작동하지 않을 수 있습니다. (Contributed by Serhiy Storchaka in bpo-22115).

### traceback

traceback 모듈과 인터프리터의 내장 예외 디스플레이는 이제 다음 예제와 같이 트레이스백에서 반복되는 긴 시퀀스의 줄을 축약합니다:

    >>> def f(): f()
    ...
    >>> f()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 1, in f
      File "<stdin>", line 1, in f
      File "<stdin>", line 1, in f
      [Previous line repeated 995 more times]
    RecursionError: maximum recursion depth exceeded

(Contributed by Emanuel Barry in bpo-26823.)

### tracemalloc

`tracemalloc` 모듈은 이제 여러 다른 주소 공간에서 메모리 할당 추적을 지원합니다.

새로운 `DomainFilter` 필터 클래스가 주소 공간(도메인)별로 블록 추적을 필터링하기 위해 추가되었습니다.

(Contributed by Victor Stinner in bpo-26588.)

### typing

`typing` 모듈이 잠정적이므로, 파이썬 3.6에 도입된 모든 변경 사항은 파이썬 3.5.x로 역 이식되었습니다.

`typing` 모듈은 제네릭 형 에일리어스에 대한 훨씬 향상된 지원을 제공합니다. 예를 들어 `Dict[str, Tuple[S, T]]`는 이제 유효한 형 어노테이션입니다. (Contributed by Guido van Rossum in Github #195.)

`contextlib.AbstractContextManager`를 나타내는 `typing.ContextManager` 클래스가 추가되었습니다. (Contributed by Brett Cannon in bpo-25609.)

`collections.abc.Collection`을 나타내는 `typing.Collection` 클래스가 추가되었습니다. (Contributed by Ivan Levkivskyi in bpo-27598.)

클래스 변수를 표시하기 위해 `typing.ClassVar` 형 구조가 추가되었습니다. PEP 526에 도입된 대로, ClassVar에 래핑 된 변수 어노테이션은 주어진 어트리뷰트가 클래스 변수로 사용되도록 의도되었으며 해당 클래스의 인스턴스에 설정되어서는 안 됨을 나타냅니다. (Contributed by Ivan Levkivskyi in Github #280.)

정적 형 검사기가 `True`로 가정하지만, 실행 시간에는 `False`인 새 `TYPE_CHECKING` 상수. (Contributed by Guido van Rossum in Github #230.)

어노테이션에 대한 경량 고유 형을 만드는 새로운 `NewType()` 도우미 함수가 추가되었습니다:

    from typing import NewType

    UserId = NewType('UserId', int)
    some_id = UserId(524313)

정적 형 검사기는 새 형을 원래 형의 서브 클래스인 것처럼 처리합니다. (Contributed by Ivan Levkivskyi in Github #189.)

### unicodedata

`unicodedata` 모듈은 이제 유니코드 9.0.0의 데이터를 사용합니다. (Contributed by Benjamin Peterson.)

### unittest.mock

`Mock` 클래스는 다음과 같이 개선되었습니다:

- 모의 객체가 호출되었는지 확인하는 두 가지 새로운 메서드, `Mock.assert_called()`와 `Mock.assert_called_once()`. (Contributed by Amit Saha in bpo-26323.)

- `Mock.reset_mock()` 메서드에는 이제 두 개의 선택적 키워드 전용 인자가 있습니다: return_value와 side_effect. (Contributed by Kushal Das in bpo-21271.)

### urllib.request

HTTP 요청에 파일이나 이터러블 본문(바이트열 객체가 아닌)이 있지만, `Content-Length` 헤더가 없으면, 에러를 던지는 대신, `AbstractHTTPHandler`는 이제 청크 전송 인코딩(chunked transfer encoding)을 사용하도록 폴백 됩니다. (Contributed by Demian Brecht and Rolf Krahl in bpo-12319.)

### urllib.robotparser

`RobotFileParser`는 이제 `Crawl-delay`와 `Request-rate` 확장을 지원합니다. (Contributed by Nikolay Bogoychev in bpo-16099.)

### venv

`venv`는 새 파라미터 `--prompt`를 받아들입니다. 이 파라미터는 가상 환경에 대한 대체 접두사를 제공합니다. (Proposed by Łukasz Balcerzak and ported to 3.6 by Stéphane Wirtel in bpo-22829.)

### warnings

새로운 선택적 source 매개 변수가 `warnings.warn_explicit()` 함수에 추가되었습니다: `ResourceWarning`을 방출한 파괴된 객체. source 어트리뷰트는 `warnings.WarningMessage`에도 추가되었습니다 (contributed by Victor Stinner in bpo-26568 and bpo-26567).

`ResourceWarning` 경고가 로그 될 때, `tracemalloc` 모듈이 이제 파괴된 객체가 할당된 트레이스백을 얻는 데 사용됩니다.

`example.py` 스크립트의 예:

    import warnings

    def func():
        return open(__file__)

    f = func()
    f = None

`python3.6 -Wd -X tracemalloc=5 example.py` 명령의 출력:

    example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
      f = None
    Object allocated at (most recent call first):
      File "example.py", lineno 4
        return open(__file__)
      File "example.py", lineno 6
        f = func()

“Object allocated at” 트레이스백은 새로운 것이며 `tracemalloc`이 파이썬 메모리 할당을 추적하고 `warnings` 모듈을 이미 임포트 했을 때만 표시됩니다.

### winreg

64비트 정수 형 `REG_QWORD`를 추가했습니다. (Contributed by Clement Rouault in bpo-23026.)

### winsound

키워드 인자가 `Beep`, `MessageBeep` 및 `PlaySound` 에 전달되도록 허용합니다 (bpo-27982).

### xmlrpc.client

`xmlrpc.client` 모듈은 이제 숫자와 `None`에 대해 Apache XML-RPC 구현에서 사용하는 추가 데이터형의 역 마셜링을 지원합니다. (Contributed by Serhiy Storchaka in bpo-26885.)

### zipfile

새로운 `ZipInfo.from_file()` 클래스 메서드를 사용하면 파일 시스템 파일에서 `ZipInfo` 인스턴스를 만들 수 있습니다. 새로운 `ZipInfo.is_dir()` 메서드를 사용하여 `ZipInfo` 인스턴스가 디렉터리를 나타내는지 확인할 수 있습니다. (Contributed by Thomas Kluyver in bpo-26039.)

이제 `ZipFile.open()` 메서드를 사용하여 데이터를 추출할 뿐만 아니라, ZIP 파일에 데이터를 쓸 수 있습니다. (Contributed by Thomas Kluyver in bpo-26039.)

### zlib

`compress()`와 `decompress()` 함수는 이제 키워드 인자를 받아들입니다. (Contributed by Aviv Palivoda in bpo-26243 and Xiang Zhang in bpo-16764 respectively.)

## 최적화

- 파이썬 인터프리터는 이제 바이트 코드 대신 16비트 워드 코드를 사용하여 여러 옵코드 최적화를 가능하게 했습니다. (Contributed by Demur Rumed with input and reviews from Serhiy Storchaka and Victor Stinner in bpo-26647 and bpo-28050.)

- `asyncio.Future` 클래스에는 이제 최적화된 C 구현이 있습니다. (Contributed by Yury Selivanov and INADA Naoki in bpo-26081.)

- `asyncio.Task` 클래스에는 이제 최적화된 C 구현이 있습니다. (Contributed by Yury Selivanov in bpo-28544.)

- `typing` 모듈의 다양한 구현 개선 사항(가령 제네릭 형의 캐싱)을 통해 최대 30배의 성능 향상과 메모리 요구량 감소가 가능해졌습니다.

- ASCII 디코더는 이제 에러 처리기 `surrogateescape`, `ignore` 및 `replace`에 대해 최대 60배 빠릅니다 (Contributed by Victor Stinner in bpo-24870).

- ASCII와 Latin1 인코더는 이제 에러 처리기 `surrogateescape`에 대해 최대 3배 빠릅니다 (Contributed by Victor Stinner in bpo-25227).

- UTF-8 인코더는 이제 에러 처리기 `ignore`, `replace`, `surrogateescape`, `surrogatepass`에 대해 최대 75배 빠릅니다 (Contributed by Victor Stinner in bpo-25267).

- UTF-8 디코더는 이제 에러 처리기 `ignore`, `replace` 및 `surrogateescape`에 대해 최대 15배 빠릅니다 (Contributed by Victor Stinner in bpo-25301).

- `bytes % args`는 이제 최대 2배 더 빠릅니다. (Contributed by Victor Stinner in bpo-25349).

- `bytearray % args`는 이제 2.5–5배 더 빠릅니다. (Contributed by Victor Stinner in bpo-25399).

- `bytes.fromhex()`와 `bytearray.fromhex()`를 최적화했습니다: 이제 2배에서 3.5배까지 빨라졌습니다. (Contributed by Victor Stinner in bpo-25401).

- `bytes.replace(b'', b'.')`와 `bytearray.replace(b'', b'.')`를 최적화했습니다: 최대 80% 더 빠릅니다. (Contributed by Josh Snider in bpo-26574).

- `PyMem_Malloc()` 도메인(`PYMEM_DOMAIN_MEM`)의 할당자 함수는 이제 C 라이브러리의 `malloc()` 함수 대신 pymalloc 메모리 할당자를 사용합니다. pymalloc 할당자는 수명이 짧은 512바이트 이하의 객체에 최적화되어 있으며, 더 큰 메모리 블록에는 `malloc()`을 사용합니다. (Contributed by Victor Stinner in bpo-26249).

- `pickle.load()`와 `pickle.loads()`는 이제 많은 작은 객체를 역 직렬화할 때 최대 10% 더 빠릅니다 (Contributed by Victor Stinner in bpo-27056).

- 키워드 인자를 함수에 전달하면 위치 인자를 전달하는 것과 비교하여 오버헤드가 있습니다. 이제 인자 클리닉(Argument Clinic)을 사용하여 구현된 확장 함수에서 이 오버헤드가 많이 감소합니다. (Contributed by Serhiy Storchaka in bpo-27574).

- `glob` 모듈에서 `glob()`과 `iglob()` 함수를 최적화했습니다; 이제 약 3–6배 더 빠릅니다. (Contributed by Serhiy Storchaka in bpo-25596).

- `os.scandir()`을 사용하여 `pathlib`에서 글로빙(globbing)을 최적화했습니다; 이제 약 1.5–4배 더 빨라졌습니다. (Contributed by Serhiy Storchaka in bpo-26032).

- `xml.etree.ElementTree` 구문 분석, 이터레이션 및 깊은 복사 성능이 크게 향상되었습니다. (Contributed by Serhiy Storchaka in bpo-25638, bpo-25873, and bpo-25869.)

- 이제 부동 소수점과 십진수(decimals)에서 `fractions.Fraction` 인스턴스를 생성하는 것이 2–3배 빨라졌습니다. (Contributed by Serhiy Storchaka in bpo-25971.)

## 빌드와 C API 변경

- 이제 파이썬을 빌드하려면 도구 체인에서 일부 C99 지원이 필요합니다. 특히, 파이썬은 이제 `PY_LONG_LONG`과 같은 사용자 정의 매크로 자리에 표준 정수 형과 매크로를 사용합니다. 자세한 내용은, PEP 7과 bpo-17884를 참조하십시오.

- 안드로이드 NDK와 안드로이드 API 수준이 21 (안드로이드 5.0 Lollipop) 이상으로 CPython을 교차 컴파일하면 성공적으로 실행됩니다. 안드로이드는 아직 지원되는 플랫폼이 아니지만, 파이썬 테스트 스위트는 약 16번의 테스트 실패만으로 안드로이드 에뮬레이터에서 실행됩니다. 안드로이드 메타 이슈 bpo-26865를 참조하세요.

- `--enable-optimizations` 구성 플래그가 추가되었습니다. 이를 켜면 PGO와 같은 값 비싼 최적화가 활성화됩니다. (Original patch by Alecsandru Patrascu of Intel in bpo-26359.)

- 이제 `PYMEM_DOMAIN_OBJ`(예를 들어: `PyObject_Malloc()`)와 `PYMEM_DOMAIN_MEM`(예를 들어: `PyMem_Malloc()`) 도메인의 할당자 함수가 호출될 때 GIL이 유지되어야 합니다.

- 버퍼링 된 데이터 플러시가 실패했는지를 나타내는 새로운 `Py_FinalizeEx()` API. (Contributed by Martin Panter in bpo-5319.)

- `PyArg_ParseTupleAndKeywords()` 는 이제 위치 전용 매개 변수를 지원합니다. 위치 전용 매개 변수는 빈 이름으로 정의됩니다. (Contributed by Serhiy Storchaka in bpo-26282).

- `PyTraceback_Print` 메서드는 이제 반복되는 줄의 긴 시퀀스를 `"[Previous line repeated {count} more times]"`로 줄여줍니다. (Contributed by Emanuel Barry in bpo-26823.)

- 새로운 `PyErr_SetImportErrorSubclass()` 함수를 사용하면 발생시킬 `ImportError`의 서브 클래스를 지정할 수 있습니다. (Contributed by Eric Snow in bpo-15767.)

- 새로운 `PyErr_ResourceWarning()` 함수는 리소스 할당의 소스를 제공하는 `ResourceWarning`을 생성하는 데 사용할 수 있습니다. (Contributed by Victor Stinner in bpo-26567.)

- 새로운 `PyOS_FSPath()` 함수는 경로류 객체의 파일 시스템 표현을 반환합니다. (Contributed by Brett Cannon in bpo-27186.)

- `PyUnicode_FSConverter()`와 `PyUnicode_FSDecoder()` 함수는 이제 경로류 객체를 받아들입니다.

## 기타 개선 사항

- `--version`(약식 형식: `-V`)이 두 번 제공되면, 파이썬은 자세한 정보로 `sys.version`을 인쇄합니다.

      $ ./python -VV
      Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04)
      [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]

## 폐지

### 새 키워드

`async`와 `await`는 변수, 클래스, 함수 또는 모듈 이름으로 사용하지 않는 것이 좋습니다. 파이썬 3.5에서 PEP 492에 의해 도입되었으며, 파이썬 3.7에서 정식 키워드가 될 것입니다. 파이썬 3.6부터, `async`나 `await`를 이름으로 사용하면 `DeprecationWarning`이 생성됩니다.

### 폐지된 파이썬 동작

제너레이터 내에서 `StopIteration` 예외를 발생시키면 이제 `DeprecationWarning`이 생성되고, 파이썬 3.7에서는 `RuntimeError`가 트리거될 것입니다. 자세한 내용은 PEP 479: 제너레이터 내부에서의 StopIteration 처리 변경를 참조하십시오.

이제 `__aiter__()` 메서드는 이전과 같이 어웨이터블을 반환하는 대신 비동기 이터레이터를 직접 반환해야 합니다. 전자를 수행하면 `DeprecationWarning`이 트리거됩니다. 이전 버전과의 호환성은 파이썬 3.7에서 제거될 것입니다. (Contributed by Yury Selivanov in bpo-27243.)

유효한 이스케이프 시퀀스가 아닌 역 슬래시 문자 쌍은 이제 `DeprecationWarning`을 생성합니다. 이것은 결국 `SyntaxError`가 될 것이지만, 몇 번의 파이썬 릴리스에서는 그렇게 되지 않을 것입니다. (Contributed by Emanuel Barry in bpo-27364.)

상대 임포트를 수행할 때, `__spec__`이나 `__package__`가 정의되지 않을 때 호출하는 모듈에서 `__name__`과 `__path__`로 폴백하면 이제 `ImportWarning`이 발생합니다. (Contributed by Rose Ames in bpo-25791.)

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

#### asynchat

`asynchat`은 폐지되었고 `asyncio`로 대체합니다. (Contributed by Mariatta in bpo-25002.)

#### asyncore

`asyncore`는 폐지되었고 `asyncio`로 대체합니다. (Contributed by Mariatta in bpo-25002.)

#### dbm

다른 `dbm` 구현과 달리, `dbm.dumb` 모듈은 `'rw'` 모드로 데이터베이스를 만들고 `'r'` 모드로 열린 데이터베이스를 수정할 수 있습니다. 이 동작은 이제 폐지되었고 3.8에서 제거됩니다. (Contributed by Serhiy Storchaka in bpo-21708.)

#### distutils

`distutils.Distribution` 생성자에 대한 문서화되지 않은 `extra_path` 인자는 이제 폐지된 것으로 간주하며 설정되면 경고가 발생합니다. 이 매개 변수에 대한 지원은 향후 파이썬 릴리스에서 제거됩니다. 자세한 내용은 bpo-27919를 참조하십시오.

#### grp

`getgrgid()`에서 정수가 아닌 인자에 대한 지원은 폐지되었습니다. (Contributed by Serhiy Storchaka in bpo-26129.)

#### importlib

`importlib.machinery.SourceFileLoader.load_module()`과 `importlib.machinery.SourcelessFileLoader.load_module()` 메서드는 이제 폐지되었습니다. 이들은 `importlib.abc.Loader.exec_module()`로 대체하도록 이전 버전의 파이썬에서 폐지되지 않은 `importlib`에 있는 유일한 `importlib.abc.Loader.load_module()` 구현입니다.

`importlib.machinery.WindowsRegistryFinder` 클래스는 이제 폐지되었습니다. 3.6.0부터, 기본적으로 (윈도우에서) `sys.meta_path`에 계속 추가되지만, 향후 릴리스에서 변경될 수 있습니다.

#### os

`os` 함수, `compile()` 및 유사한 함수에서 경로로 일반 바이트열류 객체에 대한 문서화되지 않은 지원은 이제 폐지되었습니다. (Contributed by Serhiy Storchaka in bpo-25791 and bpo-26754.)

#### re

정규식 중간에 있는 인라인 플래그 `(?letters)`에 대한 지원은 폐지되었고 향후 파이썬 버전에서 제거됩니다. 정규식 시작 부분의 플래그는 계속 허용됩니다. (Contributed by Serhiy Storchaka in bpo-22493.)

#### ssl

OpenSSL 0.9.8, 1.0.0 및 1.0.1은 폐지되었고 더는 지원되지 않습니다. 향후에 `ssl` 모듈에는 최소한 OpenSSL 1.0.2나 1.1.0이 필요합니다.

`ftplib`, `http.client`, `imaplib`, `poplib` 및 `smtplib`에서 `certfile`, `keyfile` 및 `check_hostname`과 같은 SSL 관련 인자는 폐지되었고 `context`로 대체합니다. (Contributed by Christian Heimes in bpo-28022.)

`ssl` 모듈의 몇 가지 프로토콜과 함수는 이제 폐지되었습니다. 일부 기능은 향후 버전의 OpenSSL에서 더는 사용할 수 없을 것입니다. 다른 기능들이 폐지되었고 다른 API로 대체합니다. (Contributed by Christian Heimes in bpo-28022 and bpo-26470.)

#### tkinter

`tkinter.tix` 모듈은 이제 폐지되었습니다. `tkinter` 사용자는 대신 `tkinter.ttk`를 사용해야합니다.

#### venv

`pyvenv` 스크립트는 폐지되었고 `python3 -m venv`로 대체합니다. 이것은 `pyvenv`가 연결되어있는 파이썬 인터프리터가 무엇이고 따라서 가상 환경에서 어떤 파이썬 인터프리터가 사용될 것인지에 대한 혼동을 방지합니다. (Contributed by Brett Cannon in bpo-25154.)

### xml

- As mitigation against DTD and external entity retrieval, the `xml.dom.minidom` and `xml.sax` modules no longer process external entities by default. (Contributed by Christian Heimes in gh-61441.)

### C API의 폐지된 함수와 형

문서화되지 않은 함수 `PyUnicode_AsEncodedObject()`, `PyUnicode_AsDecodedObject()`, `PyUnicode_AsEncodedUnicode()` 및 `PyUnicode_AsDecodedUnicode()` 는 이제 폐지되었습니다. 대신 범용 코덱 기반 API를 사용하십시오.

### 폐지된 빌드 옵션

`--with-system-ffi` 구성 플래그는 이제 비 macOS 유닉스 플랫폼에서 기본적으로 켜집니다. `--without-system-ffi`를 사용하여 비활성화 할 수 있지만, 플래그 사용은 폐지되었고 파이썬 3.7에서는 허용되지 않을 것입니다. macOS는 이 변경의 영향을 받지 않습니다. 많은 OS 배포자는 시스템 파이썬을 빌드할 때 이미 `--with-system-ffi` 플래그를 사용함에 유의하십시오.

## 제거

### API와 기능 제거

- 정규식에서 `'\'`와 ASCII 문자로 구성된 알 수 없는 이스케이프는 이제 에러를 발생시킵니다. `re.sub()`의 치환 템플릿에서는 여전히 허용되지만, 폐지되었습니다. `re.LOCALE` 플래그는 이제 바이너리 패턴에서만 사용할 수 있습니다.

- `inspect.getmoduleinfo()`가 제거되었습니다 (CPython 3.3부터 폐지되었습니다). `inspect.getmodulename()`은 주어진 경로에 대한 모듈 이름을 얻는 데 사용해야 합니다. (Contributed by Yury Selivanov in bpo-13248.)

- `traceback.Ignore` 클래스와 `traceback.usage`, `traceback.modname`, `traceback.fullmodname`, `traceback.find_lines_from_code`, `traceback.find_lines`, `traceback.find_strings`, `traceback.find_executable_lines` 메서드가 `traceback` 모듈에서 제거되었습니다. 그것들은 파이썬 3.2 이후 폐지된 문서화되지 않은 메서드였으며 동등한 기능은 비공개 메서드에서 사용할 수 있습니다.

- `tkinter` 위젯 클래스의 `tk_menuBar()`와 `tk_bindForTraversal()` 더미 메서드가 제거되었습니다 (해당 Tk 명령은 Tk 4.0 이후로 사용되지 않습니다).

- `zipfile.ZipFile` 클래스의 `open()` 메서드는 더는 `'U'` 모드를 지원하지 않습니다 (파이썬 3.4부터 폐지되었습니다). 유니버설 줄 넘김 모드에서 압축된 텍스트 파일을 읽으려면 `io.TextIOWrapper`를 사용하십시오.

- 문서화되지 않은 `IN`, `CDROM`, `DLFCN`, `TYPES`, `CDIO` 및 `STROPTS` 모듈이 제거되었습니다. 이들은 플랫폼별 `Lib/plat-*/` 디렉터리에 있었지만, 만성적으로 구식이었고, 여러 플랫폼에서 일관성 없이 사용할 수 있으며, 유지 관리되지 않았습니다. 이러한 모듈을 만든 스크립트는 소스 배포에서 Tools/scripts/h2py.py로 계속 제공됩니다.

- 폐지된 `asynchat.fifo` 클래스가 제거되었습니다.

## 파이썬 3.6으로 이식하기

이 섹션에서는 여러분의 코드 변경이 필요할 수 있는 이전에 설명한 변경 사항과 기타 버그 수정을 나열합니다.

### ‘python’ 명령 동작의 변경 사항

- 정의된 `COUNT_ALLOCS`, `SHOW_ALLOC_COUNT` 또는 `SHOW_TRACK_COUNT` 매크로가 있는 특수 파이썬 빌드의 출력은 이제 기본적으로 꺼져 있습니다. `-X showalloccount` 옵션을 사용하여 다시 활성화할 수 있습니다. 이제 `stdout` 대신 `stderr`로 출력됩니다. (Contributed by Serhiy Storchaka in bpo-23034.)

### 파이썬 API의 변경 사항

- `open()`은 더는 `'U'` 모드 플래그를 `'+'`와 결합하는 것을 허용하지 않습니다. (Contributed by Jeff Balogh and John O’Connor in bpo-2091.)

- `sqlite3`은 더는 DDL 문 이전에 열린 트랜잭션을 묵시적으로 커밋하지 않습니다.

- 리눅스에서, `os.urandom()`은 이제 보안을 강화하기 위해 시스템 urandom 엔트로피 풀이 초기화될 때까지 블록합니다.

- `importlib.abc.Loader.exec_module()`이 정의되면, `importlib.abc.Loader.create_module()`도 정의되어야 합니다.

- `PyErr_SetImportError()`는 이제 msg 인자가 설정되지 않았을 때 `TypeError`를 설정합니다. 이전에는 `NULL`만 반환되었습니다.

- 코드 객체의 `co_lnotab` 어트리뷰트 형식이 음수 줄 번호 델타를 지원하도록 변경되었습니다. 기본적으로, 파이썬은 음의 줄 번호 델타가 있는 바이트 코드를 내보내지 않습니다. `frame.f_lineno`, `PyFrame_GetLineNumber()` 또는 `PyCode_Addr2Line()`을 사용하는 함수는 영향을 받지 않습니다. `co_lnotab`을 직접 디코딩하는 함수는 줄 번호 델타에 부호 있는 8비트 정수 형을 사용하도록 갱신해야 하지만, 이는 음의 줄 번호 델타를 사용하는 응용 프로그램을 지원하는 데만 필요합니다. `co_lnotab` 형식과 디코딩 방법에 대해서는 `Objects/lnotab_notes.txt`를 참조하고, 그 이유는 PEP 511을 참조하십시오.

- `compileall` 모듈의 함수는 이제 `1`이나 `0` 대신 불리언을 반환하여 각각 성공이나 실패를 나타냅니다. 불리언은 정수의 서브 클래스이기 때문에, `1`이나 `0`에 대한 아이덴티티 검사를 수행하는 경우에만 문제가 됩니다. bpo-25768을 참조하십시오.

- `urllib.parse.urlsplit()`과 `urlparse()` 결과의 `port` 어트리뷰트를 읽으면 범위를 벗어난 값에 대해 이제 `None`을 반환하는 대신 `ValueError`가 발생합니다. bpo-20059를 참조하십시오.

- `imp` 모듈은 이제 `PendingDeprecationWarning` 대신 `DeprecationWarning`을 발생시킵니다.

- 다음 모듈에는 문서화된 API와 일치하도록 `__all__` 어트리뷰트에 누락된 API가 추가되었습니다: `calendar`, `cgi`, `csv`, `ElementTree`, `enum`, `fileinput`, `ftplib`, `logging`, `mailbox`, `mimetypes`, `optparse`, `plistlib`, `smtpd`, `subprocess`, `tarfile`, `threading` 및 `wave`. 이것은 `import *`가 사용될 때 새로운 심볼을 내보낼 것을 의미합니다. (Contributed by Joel Taddei and Jacek Kołodziej in bpo-23883.)

- 상대 임포트를 수행할 때, `__package__`가 `__spec__.parent`와 같다고 비교되지 않으면 `ImportWarning`이 발생합니다. (Contributed by Brett Cannon in bpo-25791.)

- 상대 임포트가 수행되고 부모 패키지가 알려지지 않았으면, `ImportError`가 발생합니다. 이전에는, `SystemError`를 발생시킬 수 있었습니다. (Contributed by Brett Cannon in bpo-18018.)

- `http.server`, `xmlrpc.server` 및 `wsgiref.simple_server`에 정의된 서버를 포함하여, `socketserver` 모듈을 기반으로 하는 서버는 이제 `Exception`에서 파생된 예외만 포착합니다. 따라서 요청 처리기가 `SystemExit`나 `KeyboardInterrupt`와 같은 예외를 발생시키면, `handle_error()`가 더는 호출되지 않고, 예외로 인해 단일 스레드 서버가 중지됩니다. (Contributed by Martin Panter in bpo-23430.)

- `spwd.getspnam()`은 이제 사용자에게 권한이 없으면 `KeyError` 대신 `PermissionError`를 발생시킵니다.

- `socket.socket.close()` 메서드는 하부 시스템 호출에 의해 에러(예를 들어 `EBADF`)가 보고되면 예외를 발생시킵니다. (Contributed by Martin Panter in bpo-26685.)

- `smtpd.SMTPChannel`과 `smtpd.SMTPServer` 생성자에 대한 decode_data 인자는 이제 기본적으로 `False`입니다. 이것은 `process_message()`에 전달된 인자가 이제 기본적으로 바이트열 객체이고, `process_message()`에 키워드 인자가 전달됨을 의미합니다. 3.5에서 생성된 폐지 경고에 따라 이미 갱신된 코드는 영향을 받지 않습니다.

- `json` 모듈의 `dump()`, `dumps()`, `load()` 및 `loads()` 함수와 `JSONEncoder`와 `JSONDecoder` 클래스 생성자의 모든 선택적 인자는 이제 키워드 전용입니다. (Contributed by Serhiy Storchaka in bpo-18726.)

- `type.__new__`를 재정의하지 않는 `type`의 서브 클래스는 더는 단일 인자 형식을 사용하여 객체 형을 가져올 수 없습니다.

- PEP 487의 일부로, `type`에 전달된 키워드 인자 (메타 클래스 힌트 `metaclass` 제외) 처리가 이제 일관되게 `object.__init_subclass__()`에 위임됩니다. 즉, `type.__new__()`와 `type.__init__()`는 이제 임의의 키워드 인자를 받아들이지만, `object.__init_subclass__()`(`type.__new__()`에서 호출됨)는 기본적으로 이를 거부합니다. 추가 키워드 인자를 받아들이는 사용자 정의 메타 클래스는 그에 따라 `type.__new__()`에 대한 호출을 조정해야 합니다 (직접 또는 `super`를 통해).

- `distutils.command.sdist.sdist`에서, `default_format` 어트리뷰트가 제거되었으며 더는 적용되지 않습니다. 대신, gzip 된 tar 파일 형식이 모든 플랫폼에서 기본값이며 플랫폼별 선택이 이루어지지 않습니다. 윈도우에서 배포가 빌드되고 zip 배포가 필요한 환경에서는, 다음을 포함하는 `setup.cfg` 파일로 프로젝트를 구성하십시오:

      [sdist]
      formats=zip

  이 동작은 Setuptools 26.0.0에 의해 이전 파이썬 버전으로 역 이식되었습니다.

- `urllib.request` 모듈과 `http.client.HTTPConnection.request()` 메서드에서, Content-Length 헤더 필드가 지정되지 않았고 요청 본문이 파일 객체이면, 이제 HTTP 1.1 청크 인코딩(chunked encoding)으로 전송됩니다. 파일 객체를 HTTP 1.0 서버로 보내야 하면, 이제 호출자가 Content-Length 값을 지정해야 합니다. (Contributed by Demian Brecht and Rolf Krahl with tweaks from Martin Panter in bpo-12319.)

- `DictReader`는 이제 `OrderedDict` 형의 행을 반환합니다. (Contributed by Steve Holden in bpo-27842.)

- 플랫폼에서 지원하지 않으면, `crypt.METHOD_CRYPT`는 더는 `crypt.methods`에 추가되지 않습니다. (Contributed by Victor Stinner in bpo-25287.)

- `namedtuple()`에 대한 verbose와 rename 인자는 이제 키워드 전용입니다. (Contributed by Raymond Hettinger in bpo-25628.)

- 리눅스에서, `ctypes.util.find_library()`는 이제 `LD_LIBRARY_PATH`에서 공유 라이브러리를 찾습니다. (Contributed by Vinay Sajip in bpo-9998.)

- `imaplib.IMAP4` 클래스는 이제 서버에서 보낸 메시지의 `']'` 문자를 포함하는 플래그를 처리하여 실세계 호환성을 향상합니다. (Contributed by Lita Cho in bpo-21815.)

- `mmap.write()` 함수는 이제 다른 쓰기 메서드와 같이 기록된 바이트 수를 반환합니다. (Contributed by Jakub Stasiak in bpo-26335.)

- `pkgutil.iter_modules()`와 `pkgutil.walk_packages()` 함수는 네임드 튜플 `ModuleInfo`를 반환합니다. (Contributed by Ramchandra Apte in bpo-17211.)

- `re.sub()`는 이제 문자열에서 패턴을 찾을 수 없는 경우에도 치환 템플릿에 있는 잘못된 숫자 그룹 참조에 대해 에러를 발생시킵니다. 이제 잘못된 그룹 참조에 대한 에러 메시지에 그룹 인덱스와 참조 위치가 포함됩니다. (Contributed by SilentGhost, Serhiy Storchaka in bpo-25953.)

- `zipfile.ZipFile`은 이제 인식할 수 없는 압축 값에 대해 `NotImplementedError` 를 발생시킵니다. 이전에는 일반 `RuntimeError`가 발생했습니다. 또한, 닫힌 ZipFile에서 `ZipFile` 메서드를 호출하거나 `'r'` 모드로 만든 ZipFile에서 `write()` 메서드를 호출하면 `ValueError`가 발생합니다. 이전에는, 이러한 시나리오에서 `RuntimeError`가 발생했습니다.

- 사용자 정의 메타 클래스가 인자가 없는 `super()`나 메서드에서 묵시적 `__class__` 클로저 변수로의 직접 참조와 결합할 때, 묵시적 `__classcell__` 이름 공간 항목은 이제 초기화를 위해 `type.__new__`까지 전달되어야 합니다. 그렇게 하지 않으면 파이썬 3.6에서는 `DeprecationWarning`이, 파이썬 3.8에서는 `RuntimeError`가 발생합니다.

- `ModuleNotFoundError` 의 도입으로, 임포트 시스템 소비자는 임포트 시스템 교체로 인해 적절한 경우 덜 구체적인 `ImportError`가 아닌 더 구체적인 예외가 발생할 것으로 기대할 수 있습니다. 이러한 소비자와의 향후 호환성을 제공하기 위해, `__import__()`를 완전히 대체하는 대체 임포트 시스템의 구현자는 모듈을 전혀 찾을 수 없을 때 새 서브 클래스를 발생시키도록 구현을 갱신해야 합니다. 기본 임포트 시스템에 대한 호환 플러그인의 구현자는 필요한 경우 기본 임포트 시스템이 새 서브 클래스를 발생시키므로 변경할 필요가 없습니다.

### C API의 변경 사항

- `PyMem_Malloc()` 할당자 패밀리는 이제 시스템 `malloc()`이 아닌 pymalloc 할당자를 사용합니다. 이제 GIL을 보유하지 않고 `PyMem_Malloc()`을 호출하는 응용 프로그램이 충돌할 수 있습니다. 응용 프로그램에서 메모리 할당자의 사용을 확인하려면 `PYTHONMALLOC` 환경 변수를 `debug`로 설정하십시오. bpo-26249를 참조하십시오.

- `Py_Exit()`(그리고 메인 인터프리터)는 이제 버퍼링 된 데이터를 플러시 하지 못하면 종료 상태를 120으로 재정의합니다. bpo-5319를 참조하십시오.

### CPython 바이트 코드 변경 사항

파이썬 3.6에서 바이트 코드에 몇 가지 주요 변경 사항이 있습니다.

- 파이썬 인터프리터는 이제 바이트 코드 대신 16비트 워드 코드를 사용합니다. (Contributed by Demur Rumed with input and reviews from Serhiy Storchaka and Victor Stinner in bpo-26647 and bpo-28050.)

- 포맷 문자열 리터럴 구현의 일부로 새로운 `FORMAT_VALUE`와 `BUILD_STRING` 옵코드. (Contributed by Eric Smith in bpo-25483 and Serhiy Storchaka in bpo-27078.)

- 상수 키를 갖는 딕셔너리 생성을 최적화하는 새로운 `BUILD_CONST_KEY_MAP` 옵코드. (Contributed by Serhiy Storchaka in bpo-27140.)

- 더 나은 성능과 더 간단한 구현을 위해 함수 호출 옵코드들이 크게 다시 작업 되었습니다. `MAKE_FUNCTION`, `CALL_FUNCTION`, `CALL_FUNCTION_KW` 및 `BUILD_MAP_UNPACK_WITH_CALL` 옵코드가 수정되었으며, 새로운 `CALL_FUNCTION_EX` 와 `BUILD_TUPLE_UNPACK_WITH_CALL`이 추가되었으며, `CALL_FUNCTION_VAR`, `CALL_FUNCTION_VAR_KW` 및 `MAKE_CLOSURE` 옵코드가 제거되었습니다. (Contributed by Demur Rumed in bpo-27095, and Serhiy Storchaka in bpo-27213, bpo-28257.)

- 새로운 변수 어노테이션 문법을 지원하기 위해 새로운 `SETUP_ANNOTATIONS`와 `STORE_ANNOTATION` 옵코드가 추가되었습니다. (Contributed by Ivan Levkivskyi in bpo-27985.)

## 파이썬 3.6.2의 주목할만한 변경 사항

### 새로운 `make regen-all` 빌드 대상

교차 컴파일을 단순화하고, 기존 버전의 파이썬을 이미 사용할 수 있을 필요 없이 CPython을 안정적으로 컴파일 할 수 있도록, autotools 기반 빌드 시스템은 더는 파일 수정 시간을 기반으로 생성된 파일을 묵시적으로 재컴파일하려고 시도하지 않습니다.

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

더 선택적인 재생성 대상도 정의됩니다 - 자세한 내용은 Makefile.pre.in을 참조하십시오.

(Contributed by Victor Stinner in bpo-23404.)

Added in version 3.6.2.

### `make touch` 빌드 대상 제거

수정 시간을 갱신하여 생성된 파일의 묵시적 재생성을 요청하는 데 이전에 사용된 `make touch` 빌드 대상이 제거되었습니다.

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

(Contributed by Victor Stinner in bpo-23404.)

버전 3.6.2에서 변경.

## 파이썬 3.6.4의 주목할만한 변경 사항

공용 API의 일부였던 `PyExc_RecursionErrorInst` 싱글톤은 멤버가 삭제되지 않아서 인터프리터 종료 중에 세그멘테이션 오류가 발생할 수 있어서 제거되었습니다. (Contributed by Xavier de Gaye in bpo-22898 and bpo-30697.)

## 파이썬 3.6.5의 주목할만한 변경 사항

이제 `locale.localeconv()` 함수는 때에 따라 임시로 `LC_CTYPE` 로케일을 `LC_NUMERIC` 로케일로 설정합니다. (Contributed by Victor Stinner in bpo-31900.)

## 파이썬 3.6.7의 주목할만한 변경 사항

`xml.dom.minidom` and `xml.sax` modules no longer process external entities by default. See also gh-61441.

3.6.7에서 `tokenize` 모듈은 이제 후행 줄 넘김이 없는 입력이 제공될 때 묵시적으로 `NEWLINE` 토큰을 내보냅니다. 이 동작은 이제 C 토크나이저가 내부적으로 수행하는 작업과 일치합니다. (Contributed by Ammar Askar in bpo-33899.)

## 파이썬 3.6.10의 주목할만한 변경 사항

심각한 보안 문제로 인해 `asyncio.loop.create_datagram_endpoint()`의 reuse_address 매개 변수는 더는 지원되지 않습니다. 이는 UDP에서 소켓 옵션 `SO_REUSEADDR`의 동작 때문입니다. 자세한 내용은 `loop.create_datagram_endpoint()` 설명서를 참조하십시오. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in bpo-37228.)

## 파이썬 3.6.13의 주목할만한 변경 사항

이전 파이썬 버전에서는 `urllib.parse.parse_qs()`와 `urllib.parse.parse_qsl()`에서 쿼리 매개 변수 구분자로 `;`과 `&`를 모두 사용할 수 있었습니다. 보안 문제와 최신 W3C 권장 사항을 준수하기 위해, `&`가 기본값인 단일 구분자 키만 허용하도록 변경되었습니다. 이 변경 사항은 영향을 받는 함수를 내부적으로 사용하므로 `cgi.parse()`와 `cgi.parse_multipart()`에도 영향을 줍니다. 자세한 내용은 해당 설명서를 참조하십시오. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967.)

## 파이썬 3.6.14의 주목할만한 변경 사항

A security fix alters the `ftplib.FTP` behavior to not trust the IPv4 address sent from the remote server when setting up a passive data channel. We reuse the ftp server IP address instead. For unusual code requiring the old behavior, set a `trust_server_pasv_ipv4_address` attribute on your FTP instance to `True`. (See gh-87451)

The presence of newline or tab characters in parts of a URL allows for some forms of attacks. Following the WHATWG specification that updates RFC 3986, ASCII newline `\n`, `\r` and tab `\t` characters are stripped from the URL by the parser `urllib.parse()` preventing such attacks. The removal characters are controlled by a new module level variable `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (See gh-88048)