파이썬 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: 비동기 컴프리헨션.

새로운 라이브러리 모듈:

CPython 구현 개선:

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

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

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

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

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

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

보안 향상:

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

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

  • hashlibssl 모듈은 이제 OpenSSL 1.1.0을 지원합니다.

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

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

윈도우 개선:

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

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

  • python.exepythonw.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}}"  # nested fields
'result:      12.35'

더 보기

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

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

기능 설명서.

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

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

primes: List[int] = []

captain: str  # Note: no initial value!

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 구현의 주목할만한 제한은 같은 함수 본문에서 awaityield를 사용할 수 없다는 것입니다. 파이썬 3.6에서는 이 제한이 해제되어 비동기 제너레이터(asynchronous generators)를 정의할 수 있습니다:

async def ticker(delay, to):
    """Yield numbers from 0 to *to* every *delay* seconds."""
    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을 구현하거나 파일 시스템 경로를 나타내는 strbytes 객체면 객체를 경로류로 간주함을 뜻합니다. 코드는 os.fspath(), os.fsdecode() 또는 os.fsencode()를 사용하여 경로류 객체의 str 및/또는 bytes 표현을 명시적으로 얻을 수 있습니다.

내장 open() 함수는 osos.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 495datetime.datetimedatetime.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.stdoutsys.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로 빌드 할 수 있습니다:

  • 함수 호출/반환

  • 가비지 수거 시작/완료

  • 실행된 코드 줄.

This can be used to instrument running interpreters in production, without the need to recompile specific debug builds or providing application-specific profiling/debugging code.

자세한 내용은 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.)

  • FutureTask 클래스는 이제 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.infmath.nan과 일치하는 cmath.infcmath.nan, 그리고 복소수 repr에서 사용하는 형식과 일치하는 cmath.infjcmath.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()에 대한 verboserename 인자는 이제 키워드 전용입니다. (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

datetimetime 클래스에는 필요할 때 현지 시간을 명확히 하는 데 사용되는 새로운 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 모듈에 FlagIntFlags라는 두 개의 새로운 열거 베이스 클래스가 추가되었습니다. 둘 다 비트별 연산자를 사용하여 결합할 수 있는 상수를 정의하는 데 사용됩니다. (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.BuiltinImporterimportlib.machinery.ExtensionFileLoaderimportlib.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 (τ) 상수가 mathcmath 모듈에 추가되었습니다. (Contributed by Lisa Roach in bpo-12345, see PEP 628 for details.)

multiprocessing

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

os

osos.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_PEERSECSO_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_ALGsendmsg_afalg()가 추가되었습니다. (Contributed by Christian Heimes in bpo-27744 with support from Victor Stinner.)

새로운 리눅스 상수 TCP_USER_TIMEOUTTCP_CONGESTION이 추가되었습니다. (Contributed by Omar Sandoval, issue:26273).

socketserver

http.server, xmlrpc.serverwsgiref.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() 메서드를 사용하여 암호 우선순위에 따라 활성화된 암호 리스트를 가져올 수 있습니다.

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

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

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 생성자와 그것을 통해 인자를 전달하는 모든 함수는 이제 encodingerrors 인자를 받아들입니다. 이들 중 하나를 지정하면 stdin, stdoutstderr 스트림에 대한 텍스트 모드가 활성화됩니다. (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

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

time

struct_time 어트리뷰트 tm_gmtofftm_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 클래스는 다음과 같이 개선되었습니다:

urllib.request

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

urllib.robotparser

RobotFileParser는 이제 Crawl-delayRequest-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, MessageBeepPlaySound 에 전달되도록 허용합니다 (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, ignorereplace에 대해 최대 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, replacesurrogateescape에 대해 최대 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 7bpo-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)]
    

폐지

새 키워드

asyncawait는 변수, 클래스, 함수 또는 모듈 이름으로 사용하지 않는 것이 좋습니다. 파이썬 3.5에서 PEP 492에 의해 도입되었으며, 파이썬 3.7에서 정식 키워드가 될 것입니다. 파이썬 3.6부터, asyncawait를 이름으로 사용하면 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

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, poplibsmtplib에서 certfile, keyfilecheck_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.)

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, CDIOSTROPTS 모듈이 제거되었습니다. 이들은 플랫폼별 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, threadingwave. 이것은 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.serverwsgiref.simple_server에 정의된 서버를 포함하여, socketserver 모듈을 기반으로 하는 서버는 이제 Exception에서 파생된 예외만 포착합니다. 따라서 요청 처리기가 SystemExitKeyboardInterrupt와 같은 예외를 발생시키면, 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.SMTPChannelsmtpd.SMTPServer 생성자에 대한 decode_data 인자는 이제 기본적으로 False입니다. 이것은 process_message()에 전달된 인자가 이제 기본적으로 바이트열 객체이고, process_message()에 키워드 인자가 전달됨을 의미합니다. 3.5에서 생성된 폐지 경고에 따라 이미 갱신된 코드는 영향을 받지 않습니다.

  • json 모듈의 dump(), dumps(), load()loads() 함수와 JSONEncoderJSONDecoder 클래스 생성자의 모든 선택적 인자는 이제 키워드 전용입니다. (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()에 대한 verboserename 인자는 이제 키워드 전용입니다. (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_VALUEBUILD_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_KWBUILD_MAP_UNPACK_WITH_CALL 옵코드가 수정되었으며, 새로운 CALL_FUNCTION_EXBUILD_TUPLE_UNPACK_WITH_CALL이 추가되었으며, CALL_FUNCTION_VAR, CALL_FUNCTION_VAR_KWMAKE_CLOSURE 옵코드가 제거되었습니다. (Contributed by Demur Rumed in bpo-27095, and Serhiy Storchaka in bpo-27213, bpo-28257.)

  • 새로운 변수 어노테이션 문법을 지원하기 위해 새로운 SETUP_ANNOTATIONSSTORE_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.)

버전 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의 주목할만한 변경 사항

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