파이썬 3.9의 새로운 기능

배포

3.9.0b1

날짜

5월 27, 2020

이 기사에서는 3.8과 비교하여 파이썬 3.9의 새로운 기능에 관해 설명합니다.

자세한 내용은 changelog를 참조하십시오.

참고

시험판 사용자는 이 문서가 현재 초안임을 고려해야 합니다. 파이썬 3.9 출시에 가까워 짐에 따라 크게 수정될 것이므로, 이전 버전을 읽은 후에도 다시 확인할 만한 가치가 있습니다.

요약 -- 배포 주요 사항

여러분의 코드에서 DeprecationWarning을 확인해야합니다

파이썬 2.7이 여전히 지원될 때, 파이썬 2.7과의 과거 호환성을 위해 많은 함수가 유지되었습니다. 파이썬 2.7 지원이 종료되면서, 이러한 이전 버전과의 호환성 계층이 제거되었거나, 곧 제거 될 예정입니다. 그들 대부분은 몇 년 동안 DeprecationWarning 경고를 내보냈습니다. 예를 들어, collections.abc.Mapping 대신 collections.Mapping을 사용하면 2012 년에 배포된 파이썬 3.3 이후 DeprecationWarning을 내보냅니다.

-W default 명령 줄 옵션으로 응용 프로그램을 테스트하여 DeprecationWarningPendingDeprecationWarning을 보십시오. 또는 -W error로 아예 에러로 취급하십시오. 경고 필터를 사용하면 제삼자 코드의 경고를 무시할 수 있습니다.

파이썬 프로젝트 지원 담당자가 파이썬 2 지원 제거를 구성하고 파이썬 3.9에 대한 지원을 추가할 수 있도록 더 많은 시간을 제공하기 위해, 마지막 하나의 배포에 대해 몇 가지 과거 호환성을 유지하기로 결정했습니다.

collections 모듈의 추상 베이스 클래스에 대한 별칭(collections.abc.Mapping에 대한 collections.Mapping 별칭과 같은)은 이전 버전과의 호환성을 위해 마지막 배포 하나에서 유지됩니다. 파이썬 3.10에서 제거됩니다.

더 일반적으로, 파이썬 개발 모드에서 테스트를 실행하면 다음 파이썬 버전과 호환되도록 코드를 준비하는 데 도움이됩니다.

새로운 기능

딕셔너리 병합과 업데이트 연산자

내장 dict 클래스에 병합(|)과 업데이트(|=) 연산자가 추가되었습니다. 자세한 설명은 PEP 584를 참조하십시오. (Contributed by Brandt Bucher in bpo-36144.)

PEP 616: 새로운 removeprefix() 와 removesuffix() 문자열 메서드

문자열에서 불필요한 접두사나 접미사를 쉽게 제거하기 위해 str.removeprefix(prefix)str.removesuffix(suffix)가 추가되었습니다. 해당 bytes, bytearraycollections.UserString 메서드도 추가되었습니다. 자세한 설명은 PEP 616을 참조하십시오. (Contributed by Dennis Sweeney in bpo-18939.)

PEP 585: 내장 제네릭 형

형 어노테이션에서 이제 typing에서 해당 대문자 형(예를 들어 ListDict)을 임포트하는 대신 listdict와 같은 내장 컬렉션 형을 제네릭 형으로 사용할 수 있습니다. 표준 라이브러리의 일부 다른 형도 이제 제네릭입니다, 예를 들어 queue.Queue.

예:

def greet_all(names: list[str]) -> None:
    for name in names:
        print("Hello", name)

자세한 내용은 PEP 585를 참조하십시오. (Contributed by Guido van Rossum, Ethan Smith, and Batuhan Taşkaya in bpo-39481.)

PEP 617: 새로운 구문 분석기

파이썬 3.9는 LL(1) 대신 PEG를 기반으로하는 새로운 구문 분석기를 사용합니다. 새로운 구문 분석기의 성능은 기존 구문 분석기의 성능과 거의 비슷하지만, PEG 형식은 새로운 언어 기능을 설계할 때 LL(1)보다 더 유연합니다. 파이썬 3.10 이상에서 이 유연성을 사용하기 시작할 것입니다.

ast 모듈은 새 구문 분석기를 사용하며 이전 구문 분석기와 같은 AST를 생성합니다.

파이썬 3.10에서는, 이전 구문 분석기가 삭제되어, 여기에 의존하는 모든 기능도 제거됩니다 (주로 오랜기간 폐지되었던 parser 모듈). 파이썬 3.9에서 , 명령 줄 스위치(-X oldparser)나 환경 변수(PYTHONOLDPARSER=1)를 사용하여 LL(1) 구문 분석기로 다시 전환 할 수 있습니다.

자세한 내용은 PEP 617을 참조하십시오. (Contributed by Guido van Rossum, Pablo Galindo and Lysandros Nikolau in bpo-40334.)

기타 언어 변경

  • __import__()는 이제 ValueError 대신 ImportError를 발생시킵니다. 이는 상대적 임포트가 최상위 수준 패키지를 넘어갈 때 발생했습니다. (Contributed by Ngalim Siregar in bpo-37444.)

  • 파이썬은 이제 명령 줄에 지정된 스크립트 파일 이름의 절대 경로를 얻습니다 (예: python3 script.py): __main__ 모듈의 __file__ 어트리뷰트는 상대 경로대신 절대 경로가 됩니다. 이 경로는 현재 디렉터리가 os.chdir()에 의해 변경된 후에도 계속 유효합니다. 부작용으로, 이 경우 트레이스백은 __main__ 모듈 프레임에 대해 절대 경로를 표시합니다. (Contributed by Victor Stinner in bpo-20443.)

  • 파이썬 개발 모드와 디버그 빌드에서, 이제 문자열 인코딩과 디코딩 연산을 위해 encodingerrors 인자가 검사됩니다. 예: open(), str.encode()bytes.decode().

    기본적으로, 최상의 성능을 위해, errors 인자는 첫 번째 인코딩/디코딩 에러에서만 확인되며 빈 문자열에 대해서는 encoding 인자가 무시되는 경우가 있습니다. (Contributed by Victor Stinner in bpo-37388.)

  • "".replace("", s, n)는 이제 0이 아닌 모든 n에 대해 빈 문자열 대신 s를 반환합니다. 이제 "".replace("", s)와 일관성있습니다. bytesbytearray 객체에 대해 유사한 변경 사항이 있습니다. (Contributed by Serhiy Storchaka in bpo-28029.)

  • 이제 모든 유효한 표현식을 데코레이터로 사용할 수 있습니다. 이전에는, 문법이 훨씬 제한적이었습니다. 자세한 내용은 PEP 614를 참조하십시오. (Contributed by Brandt Bucher in bpo-39702.)

  • typing 모듈에 대한 도움말이 개선되었습니다. 모든 특수 형식과 특수 제네릭 에일리어스(UnionList 같은)에 대한 독스트링이 이제 표시됩니다. List[int]와 같은 제네릭 에일리어스로 help()를 사용하면 해당 구상 형(이 경우 list)에 대한 도움말이 표시됩니다. (Contributed by Serhiy Storchaka in bpo-40257.)

새 모듈

zoneinfo

zoneinfo 모듈은 IANA 시간대 데이터베이스 지원을 표준 라이브러리에 도입합니다. 시스템의 시간대 데이터로 뒷받침되는 구상 datetime.tzinfo 구현인 zoneinfo.ZoneInfo를 추가합니다.

예:

>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta

>>> # 일광 절약 시간
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'

>>> # 표준 시간
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST

IANA 데이터베이스를 제공하지 않는 플랫폼의 대체 데이터 소스로, tzdata 모듈이 자사(first-party) 패키지로 출시되었습니다 -- PyPI를 통해 배포되고 CPython 핵심 팀에서 유지 관리합니다.

더 보기

PEP 615 -- 표준 라이브러리의 IANA 시간대 데이터베이스에 대한 지원

Paul Ganssle이 작성하고 구현한 PEP

개선된 모듈

ast

indent 옵션을 dump()에 추가하여 여러 줄 들여쓰기된 출력을 생성할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-37995.)

ast.AST 객체를 역 구문 분석하고, 구문 분석할 때 동등한 ast.AST 객체를 생성하는 코드가 담긴 문자열을 생성하는 데 사용할 수 있는 ast.unparse()ast 모듈의 함수로 추가했습니다. (Contributed by Pablo Galindo and Batuhan Taskaya in bpo-38870.)

AST 노드를 생성하는 데 사용 된 ASDL 서명이 포함된 독스트링을 AST 노드에 추가했습니다. (Contributed by Batuhan Taskaya in bpo-39638.)

asyncio

심각한 보안 문제로 인해, 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.)

ThreadPoolExecutor가 닫기를 끝내기를 기다리는 기본 실행기의 종료(shutdown)를 예약하는 새 코루틴 shutdown_default_executor()가 추가되었습니다. 또한, asyncio.run()은 새로운 코루틴을 사용하도록 갱신되었습니다. (Contributed by Kyle Stanley in bpo-34037.)

프로세스 파일 기술자를 폴링하는 리눅스 특정 자식 감시자 구현인, asyncio.PidfdChildWatcher를 추가했습니다. (bpo-38692)

compileall

복제된 .pyc 파일에 대해 하드 링크를 사용하는 새로운 가능성이 추가되었습니다: hardlink_dupes 매개 변수와 --hardlink-dupes 명령 줄 옵션. (Contributed by Lumír 'Frenzy' Balhar in bpo-40495.)

결과 .pyc 파일에서 경로 조작을 위한 새로운 옵션을 추가했습니다: stripdir, prependdir, limit_sl_dest 매개 변수와 -s, -p, -e 명령 줄 옵션. 최적화 수준에 대한 옵션을 여러 번 지정할 수 있는 가능성이 추가되었습니다. (Contributed by Lumír 'Frenzy' Balhar in bpo-38112.)

concurrent.futures

실행기를 종료하기 전에 완료되기를 기다리는 대신, 실행을 시작하지 않은 모든 계류 중인 퓨처를 취소하는 새 cancel_futures 매개 변수를 concurrent.futures.Executor.shutdown()에 추가했습니다. (Contributed by Kyle Stanley in bpo-39349.)

ThreadPoolExecutorProcessPoolExecutor에서 데몬 스레드를 제거했습니다. 이를 통해 종료 절차에서 서브 인터프리터와의 호환성과 예측성이 향상됩니다. (Contributed by Kyle Stanley in bpo-39812.)

재사용 가능한 유휴 작업자가 없을 때만, ProcessPoolExecutor의 작업자가 요청 시 스폰됩니다. 이는 시작 오버헤드를 최적화하고 유휴 작업자에게 손실되는 CPU 시간을 줄입니다. (Contributed by Kyle Stanley in bpo-39207.)

curses

curses.get_escdelay(), curses.set_escdelay(), curses.get_tabsize()curses.set_tabsize() 함수를 추가했습니다. (Contributed by Anthony Sottile in bpo-38312.)

datetime

datetime.dateisocalendar()datetime.datetimeisocalendar() 메서드는 이제 tuple 대신 namedtuple()을 반환합니다. (Contributed by Dong-hee Na in bpo-24416.)

fcntl

상수 F_OFD_GETLK, F_OFD_SETLKF_OFD_SETLKW를 추가했습니다. (Contributed by Dong-hee Na in bpo-38602.)

ftplib

비 블로킹 소켓의 생성을 막기 위해 생성자에 대해 주어진 시간 제한이 0이면 FTPFTP_TLS는 이제 ValueError를 발생시킵니다. (Contributed by Dong-hee Na in bpo-39259.)

functools

그래프의 위상 정렬을 수행하는 기능을 제공하기 위해 functools.TopologicalSorter 클래스를 추가했습니다. (Contributed by Pablo Galindo, Tim Peters and Larry Hastings in bpo-17005.)

gc

가비지 수거기가 일부 객체를 되살리는 컬렉션을 만들 때 (파이널라이저가 실행된 후 격리된 순환 외부에서 도달할 수 있습니다), 여전히 도달할 수 없는 모든 객체의 컬렉션을 차단하지 않습니다. (Contributed by Pablo Galindo and Tim Peters in bpo-38379.)

가비지 수거기에서 객체가 파이널라이즈되었는지 확인하는 새 함수 gc.is_finalized()를 추가했습니다. (Contributed by Pablo Galindo in bpo-39322.)

hashlib

내장 해시 모듈은 이제 ./configure --without-builtin-hashlib-hashes로 비활성화하거나 ./configure --with-builtin-hashlib-hashes=sha3,blake2로 선택적으로 활성화하여 OpenSSL 기반 구현의 사용을 강제할 수 있습니다. (Contributed by Christian Heimes in bpo-40479)

http

HTTP 상태 코드 103 EARLY_HINTS, 418 IM_A_TEAPOT425 TOO_EARLYhttp.HTTPStatus에 추가되었습니다. (Contributed by Dong-hee Na in bpo-39509 and Ross Rhodes in bpo-39507.)

imaplib

IMAP4IMAP4_SSL에는 이제 생성자에 선택적 timeout 매개 변수가 있습니다. 또한 open() 메서드에는 이제 이 변경으로 인해 선택적 timeout 매개 변수가 있습니다. 재정의 된 IMAP4_SSLIMAP4_stream 메서드에 이 변경이 적용되었습니다. (Contributed by Dong-hee Na in bpo-38615.)

imaplib.IMAP4.unselect()가 추가되었습니다. imaplib.IMAP4.unselect()는 선택한 사서함과 관련된 서버 자원을 해제하고 서버를 인증된 상태로 되돌립니다. 이 명령은 현재 선택된 사서함에서 메시지가 영구적으로 제거되지 않는다는 점을 제외하고 imaplib.IMAP4.close()와 같은 작업을 수행합니다. (Contributed by Dong-hee Na in bpo-40375.)

importlib

import 문과의 일관성을 개선하기 위해, importlib.util.resolve_name()은 이제 잘못된 상대 임포트 시도에 대해 ValueError 대신 ImportError를 발생시킵니다. (Contributed by Ngalim Siregar in bpo-37444.)

inspect

inspect.BoundArguments.argumentsOrderedDict에서 일반 dict로 변경되었습니다. (Contributed by Inada Naoki in bpo-36350 and bpo-39775.)

ipaddress

ipaddress는 이제 IPv6 스코프된 주소(접미사 %<scope_id>가 있는 IPv6 주소)를 지원합니다.

스코프된 IPv6 주소는 ipaddress.IPv6Address를 사용하여 구문 분석할 수 있습니다. 존재하면, scope_id 어트리뷰트를 통해 스코프 존 ID를 사용할 수 있습니다. (Contributed by Oleksandr Pavliuk in bpo-34788.)

math

여러 인자를 처리하도록 math.gcd() 함수를 확장했습니다. 이전에는 두 개의 인자 만 지원했습니다. (Contributed by Serhiy Storchaka in bpo-39648.)

math.lcm()을 추가했습니다: 지정된 인자의 최소 공배수를 반환합니다. (Contributed by Mark Dickinson, Ananthakrishnan and Serhiy Storchaka in bpo-39479 and bpo-39648.)

math.nextafter()를 추가했습니다: y를 향해 x 뒤의 다음 부동 소수점 값을 반환합니다. (Contributed by Victor Stinner in bpo-39288.)

math.ulp()를 추가했습니다: 부동 소수점의 최하위 비트 값을 반환합니다. (Contributed by Victor Stinner in bpo-39310.)

multiprocessing

multiprocessing.SimpleQueue 클래스에는 큐를 명시적으로 닫는 새로운 close() 메서드가 있습니다. (Contributed by Victor Stinner in bpo-30966.)

nntplib

생성자에 대해 주어진 시간 제한이 0이면 비 블로킹 소켓을 만드는 것을 막기 위해 NNTPNNTP_SSL은 이제 ValueError를 발생시킵니다. (Contributed by Dong-hee Na in bpo-39259.)

os

si_codeCLD_KILLEDCLD_STOPPED를 추가했습니다. (Contributed by Dong-hee Na in bpo-38493.)

파일 기술자를 사용한 프로세스 관리를 위해 리눅스 특정 os.pidfd_open()(bpo-38692)과 os.P_PIDFD(bpo-38713)를 노출했습니다.

os.unsetenv() 함수는 이제 윈도우에서도 사용할 수 있습니다. (Contributed by Victor Stinner in bpo-39413.)

os.putenv()os.unsetenv() 함수를 이제 항상 사용할 수 있습니다. (Contributed by Victor Stinner in bpo-39395.)

os.waitstatus_to_exitcode() 함수를 추가했습니다: 대기 상태를 종료 코드로 변환합니다. (Contributed by Victor Stinner in bpo-40094.)

pathlib

os.readlink()와 유사하게 작동하는 pathlib.Path.readlink()를 추가했습니다. (Contributed by Girts Folkmanis in bpo-30618)

poplib

생성자에 대해 주어진 시간 제한이 0이면 비 블로킹 소켓을 만드는 것을 막기 위해 POP3POP3_SSL은 이제 ValueError를 발생시킵니다. (Contributed by Dong-hee Na in bpo-39259.)

pprint

pprint는 이제 types.SimpleNamespace를 예쁘게 인쇄 할 수 있습니다. (Contributed by Carl Bordum Hansen in bpo-37376.)

pydoc

독스트링은 이제 클래스, 함수, 메서드 등뿐만 아니라 자체 __doc__ 어트리뷰트를 가진 모든 객체에 대해 표시됩니다. (Contributed by Serhiy Storchaka in bpo-40257.)

random

새로운 random.Random.randbytes 메서드를 추가했습니다: 무작위 바이트열을 생성합니다. (Contributed by Victor Stinner in bpo-40286.)

signal

pid 대신 파일 기술자를 사용하여 프로세스에 시그널을 보내는 리눅스 특정 signal.pidfd_send_signal()을 노출했습니다. (bpo-38712)

smtplib

생성자에 대해 주어진 시간 제한이 0이면 비 블로킹 소켓을 만드는 것을 막기 위해 SMTPSMTP_SSL은 이제 ValueError를 발생시킵니다. (Contributed by Dong-hee Na in bpo-39259.)

LMTP 생성자는 이제 선택적 timeout 매개 변수를 갖습니다. (Contributed by Dong-hee Na in bpo-39329.)

socket

socket 모듈은 이제 리눅스 4.1 이상에서 CAN_RAW_JOIN_FILTERS 상수를 내 보냅니다. (Contributed by Stefan Tatschner and Zackery Spytz in bpo-25780.)

time

AIX에서, thread_time()은 이제 10ms 해상도의 clock_gettime(CLOCK_THREAD_CPUTIME_ID)가 아니라 나노초 해상도의 thread_cputime()으로 구현됩니다. (Contributed by Batuhan Taskaya in bpo-40192)

sys

새로운 sys.platlibdir 어트리뷰트를 추가했습니다: 플랫폼 별 라이브러리 디렉터리의 이름. 플랫폼 별 동적 라이브러리의 경로와 표준 라이브러리의 경로를 빌드하는 데 사용됩니다. 대부분의 플랫폼에서 "lib"와 같습니다. Fedora와 SuSE에서는, 64비트 플랫폼에서 "lib64"와 같습니다. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)

이전에는, 비 대화형일 때 sys.stderr가 블록 버퍼링 되었습니다. 이제 stderr은 기본적으로 항상 줄 버퍼링 됩니다. (Contributed by Jendrik Seipp in bpo-13601.)

typing

PEP 593은 문맥 별 메타 데이터로 기존 형을 데코레이트하는 typing.Annotated 형과 실행시간에 메타 데이터에 액세스하기 위해 typing.get_type_hints()에 새로운 include_extras 매개 변수를 도입했습니다. (Contributed by Till Varoquaux and Konstantin Kashin.)

unicodedata

유니코드 데이터베이스가 버전 13.0.0으로 갱신되었습니다. (bpo-39926).

venv

venv가 제공하는 활성화 스크립트는 이제 모두 항상 __VENV_PROMPT__로 지정된 값을 사용하여 프롬프트 사용자 정의를 일관되게 지정합니다. 이전에는 일부 스크립트는 __VENV_PROMPT__를 무조건 사용했으며, 다른 스크립트는 설정되었을 때만 (이것이 기본입니다) __VENV_PROMPT__를 사용했으며 어떤 것은 대신 __VENV_NAME__을 사용했습니다. (Contributed by Brett Cannon in bpo-37663.)

xml

xml.etree.ElementTree를 XML 파일로 직렬화 할 때 어트리뷰트 내의 공백 문자가 이제 유지됩니다. EOLN은 더는 "n"으로 정규화되지 않습니다. 이것은 XML 명세의 2.11 섹션을 해석하는 방법에 대한 논의 결과입니다. (Contributed by Mefistotelis in bpo-39011.)

최적화

  • 컴프리헨션에서 임시 변수를 대입하는 관용구를 최적화했습니다. 이제 컴프리헨션에서 for y in [expr]는 단순 대입 y = expr만큼 빠릅니다. 예를 들면:

    sums = [s for s in [0] for x in data for s in [s + x]]

    := 연산자와 달리 이 관용구는 변수를 외부 스코프로로 누출하지 않습니다.

    (Contributed by Serhiy Storchaka in bpo-32856.)

  • 다중 스레드 응용 프로그램에서 시그널 처리를 최적화했습니다. 메인 스레드와 다른 스레드가 신호를 받으면, 처리 할 수 없는 계류중인 시그널을 확인하기 위해 바이트 코드 평가 루프가 더는 각 바이트 코드 명령에서 중단되지 않습니다. 메인 인터프리터의 메인 스레드 만 시그널을 처리할 수 있습니다.

    이전에는, 메인 스레드가 시그널을 처리할 때까지 각 명령에서 바이트 코드 평가 루프가 중단되었습니다. (Contributed by Victor Stinner in bpo-40010.)

  • closefrom()을 사용하여 FreeBSD에서 subprocess 모듈을 최적화했습니다. (Contributed by Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak and Victor Stinner in bpo-38061.)

폐지

  • The distutils bdist_msi command is now deprecated, use bdist_wheel (wheel packages) instead. (Contributed by Hugo van Kemenade in bpo-39586.)

  • Currently math.factorial() accepts float instances with non-negative integer values (like 5.0). It raises a ValueError for non-integral and negative floats. It is now deprecated. In future Python versions it will raise a TypeError for all floats. (Contributed by Serhiy Storchaka in bpo-37315.)

  • The parser module is deprecated and will be removed in future versions of Python. For the majority of use cases, users can leverage the Abstract Syntax Tree (AST) generation and compilation stage, using the ast module.

  • Using NotImplemented in a boolean context has been deprecated, as it is almost exclusively the result of incorrect rich comparator implementations. It will be made a TypeError in a future version of Python. (Contributed by Josh Rosenberg in bpo-35712.)

  • The random module currently accepts any hashable type as a possible seed value. Unfortunately, some of those types are not guaranteed to have a deterministic hash value. After Python 3.9, the module will restrict its seeds to None, int, float, str, bytes, and bytearray.

  • Opening the GzipFile file for writing without specifying the mode argument is deprecated. In future Python versions it will always be opened for reading by default. Specify the mode argument for opening it for writing and silencing a warning. (Contributed by Serhiy Storchaka in bpo-28286.)

  • Deprecated the split() method of _tkinter.TkappType in favour of the splitlist() method which has more consistent and predicable behavior. (Contributed by Serhiy Storchaka in bpo-38371.)

  • The explicit passing of coroutine objects to asyncio.wait() has been deprecated and will be removed in version 3.11. (Contributed by Yury Selivanov and Kyle Stanley in bpo-34790.)

  • binhex4 and hexbin4 standards are now deprecated. The binhex module and the following binascii functions are now deprecated:

    (Contributed by Victor Stinner in bpo-39353.)

  • ast classes slice, Index and ExtSlice are considered deprecated and will be removed in future Python versions. value itself should be used instead of Index(value). Tuple(slices, Load()) should be used instead of ExtSlice(slices). (Contributed by Serhiy Storchaka in bpo-32892.)

  • ast classes Suite, Param, AugLoad and AugStore are considered deprecated and will be removed in future Python versions. They were not generated by the parser and not accepted by the code generator in Python 3. (Contributed by Batuhan Taskaya in bpo-39639 and bpo-39969 and Serhiy Storchaka in bpo-39988.)

  • The PyEval_InitThreads() and PyEval_ThreadsInitialized() functions are now deprecated and will be removed in Python 3.11. Calling PyEval_InitThreads() now does nothing. The GIL is initialized by Py_Initialize() since Python 3.7. (Contributed by Victor Stinner in bpo-39877.)

  • Passing None as the first argument to the shlex.split() function has been deprecated. (Contributed by Zackery Spytz in bpo-33262.)

  • The lib2to3 module now emits a PendingDeprecationWarning. Python 3.9 switched to a PEG parser (see PEP 617), and Python 3.10 may include new language syntax that is not parsable by lib2to3's LL(1) parser. The lib2to3 module may be removed from the standard library in a future Python version. Consider third-party alternatives such as LibCST or parso. (Contributed by Carl Meyer in bpo-40360.)

Removed

  • The erroneous version at unittest.mock.__version__ has been removed.

  • nntplib.NNTP: xpath() and xgtitle() methods have been removed. These methods are deprecated since Python 3.3. Generally, these extensions are not supported or not enabled by NNTP server administrators. For xgtitle(), please use nntplib.NNTP.descriptions() or nntplib.NNTP.description() instead. (Contributed by Dong-hee Na in bpo-39366.)

  • array.array: tostring() and fromstring() methods have been removed. They were aliases to tobytes() and frombytes(), deprecated since Python 3.2. (Contributed by Victor Stinner in bpo-38916.)

  • The undocumented sys.callstats() function has been removed. Since Python 3.7, it was deprecated and always returned None. It required a special build option CALL_PROFILE which was already removed in Python 3.7. (Contributed by Victor Stinner in bpo-37414.)

  • The sys.getcheckinterval() and sys.setcheckinterval() functions have been removed. They were deprecated since Python 3.2. Use sys.getswitchinterval() and sys.setswitchinterval() instead. (Contributed by Victor Stinner in bpo-37392.)

  • The C function PyImport_Cleanup() has been removed. It was documented as: "Empty the module table. For internal use only." (Contributed by Victor Stinner in bpo-36710.)

  • _dummy_thread and dummy_threading modules have been removed. These modules were deprecated since Python 3.7 which requires threading support. (Contributed by Victor Stinner in bpo-37312.)

  • aifc.openfp() alias to aifc.open(), sunau.openfp() alias to sunau.open(), and wave.openfp() alias to wave.open() have been removed. They were deprecated since Python 3.7. (Contributed by Victor Stinner in bpo-37320.)

  • The isAlive() method of threading.Thread has been removed. It was deprecated since Python 3.8. Use is_alive() instead. (Contributed by Dong-hee Na in bpo-37804.)

  • Methods getchildren() and getiterator() of classes ElementTree and Element in the ElementTree module have been removed. They were deprecated in Python 3.2. Use iter(x) or list(x) instead of x.getchildren() and x.iter() or list(x.iter()) instead of x.getiterator(). The xml.etree.cElementTree module has been removed, use the xml.etree.ElementTree module instead. Since Python 3.3 the xml.etree.cElementTree module has been deprecated, the xml.etree.ElementTree module uses a fast implementation whenever available. (Contributed by Serhiy Storchaka in bpo-36543.)

  • The old plistlib API has been removed, it was deprecated since Python 3.4. Use the load(), loads(), dump(), and dumps() functions. Additionally, the use_builtin_types parameter was removed, standard bytes objects are always used instead. (Contributed by Jon Janzen in bpo-36409.)

  • The C function PyThreadState_DeleteCurrent() has been removed. It was not documented. (Contributed by Joannah Nanjekye in bpo-37878.)

  • The C function PyGen_NeedsFinalizing has been removed. It was not documented, tested, or used anywhere within CPython after the implementation of PEP 442. Patch by Joannah Nanjekye. (Contributed by Joannah Nanjekye in bpo-15088)

  • base64.encodestring() and base64.decodestring(), aliases deprecated since Python 3.1, have been removed: use base64.encodebytes() and base64.decodebytes() instead. (Contributed by Victor Stinner in bpo-39351.)

  • fractions.gcd() function has been removed, it was deprecated since Python 3.5 (bpo-22486): use math.gcd() instead. (Contributed by Victor Stinner in bpo-39350.)

  • The buffering parameter of bz2.BZ2File has been removed. Since Python 3.0, it was ignored and using it emitted a DeprecationWarning. Pass an open file object to control how the file is opened. (Contributed by Victor Stinner in bpo-39357.)

  • The encoding parameter of json.loads() has been removed. As of Python 3.1, it was deprecated and ignored; using it has emitted a DeprecationWarning since Python 3.8. (Contributed by Inada Naoki in bpo-39377)

  • with (await asyncio.lock): and with (yield from asyncio.lock): statements are not longer supported, use async with lock instead. The same is correct for asyncio.Condition and asyncio.Semaphore. (Contributed by Andrew Svetlov in bpo-34793.)

  • The sys.getcounts() function, the -X showalloccount command line option and the show_alloc_count field of the C structure PyConfig have been removed. They required a special Python build by defining COUNT_ALLOCS macro. (Contributed by Victor Stinner in bpo-39489.)

  • The _field_types attribute of the typing.NamedTuple class has been removed. It was deprecated deprecated since Python 3.8. Use the __annotations__ attribute instead. (Contributed by Serhiy Storchaka in bpo-40182.)

  • The symtable.SymbolTable.has_exec() method has been removed. It was deprecated since 2006, and only returning False when it's called. (Contributed by Batuhan Taskaya in bpo-40208)

Porting to Python 3.9

This section lists previously described changes and other bugfixes that may require changes to your code.

Changes in the Python API

  • __import__() and importlib.util.resolve_name() now raise ImportError where it previously raised ValueError. Callers catching the specific exception type and supporting both Python 3.9 and earlier versions will need to catch both using except (ImportError, ValueError):.

  • The venv activation scripts no longer special-case when __VENV_PROMPT__ is set to "".

  • The select.epoll.unregister() method no longer ignores the EBADF error. (Contributed by Victor Stinner in bpo-39239.)

  • The compresslevel parameter of bz2.BZ2File became keyword-only, since the buffering parameter has been removed. (Contributed by Victor Stinner in bpo-39357.)

  • Simplified AST for subscription. Simple indices will be represented by their value, extended slices will be represented as tuples. Index(value) will return a value itself, ExtSlice(slices) will return Tuple(slices, Load()). (Contributed by Serhiy Storchaka in bpo-34822.)

  • The importlib module now ignores the PYTHONCASEOK environment variable when the -E or -I command line options are being used.

  • The encoding parameter has been added to the classes ftplib.FTP and ftplib.FTP_TLS as a keyword-only parameter, and the default encoding is changed from Latin-1 to UTF-8 to follow RFC 2640.

  • asyncio.loop.shutdown_default_executor() has been added to AbstractEventLoop, meaning alternative event loops that inherit from it should have this method defined. (Contributed by Kyle Stanley in bpo-34037.)

  • The constant values of future flags in the __future__ module is updated in order to prevent collision with compiler flags. Previously PyCF_ALLOW_TOP_LEVEL_AWAIT was clashing with CO_FUTURE_DIVISION. (Contributed by Batuhan Taskaya in bpo-39562)

  • array('u') now uses wchar_t as C type instead of Py_UNICODE. This change doesn't affect to its behavior because Py_UNICODE is alias of wchar_t since Python 3.3. (Contributed by Inada Naoki in bpo-34538.)

CPython bytecode changes

Build Changes

  • Add --with-platlibdir option to the configure script: name of the platform-specific library directory, stored in the new sys.platlibdir attribute. See sys.platlibdir attribute for more information. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)

  • The COUNT_ALLOCS special build macro has been removed. (Contributed by Victor Stinner in bpo-39489.)

  • On non-Windows platforms, the setenv() and unsetenv() functions are now required to build Python. (Contributed by Victor Stinner in bpo-39395.)

C API Changes

새로운 기능

Porting to Python 3.9

  • PyInterpreterState.eval_frame (PEP 523) now requires a new mandatory tstate parameter (PyThreadState*). (Contributed by Victor Stinner in bpo-38500.)

  • Extension modules: m_traverse, m_clear and m_free functions of PyModuleDef are no longer called if the module state was requested but is not allocated yet. This is the case immediately after the module is created and before the module is executed (Py_mod_exec function). More precisely, these functions are not called if m_size is greater than 0 and the module state (as returned by PyModule_GetState()) is NULL.

    Extension modules without module state (m_size <= 0) are not affected.

  • If Py_AddPendingCall() is called in a subinterpreter, the function is now scheduled to be called from the subinterpreter, rather than being called from the main interpreter. Each subinterpreter now has its own list of scheduled calls. (Contributed by Victor Stinner in bpo-39984.)

  • The Windows registry is no longer used to initialize sys.path when the -E option is used (if PyConfig.use_environment is set to 0). This is significant when embedding Python on Windows. (Contributed by Zackery Spytz in bpo-8901.)

  • The global variable PyStructSequence_UnnamedField is now a constant and refers to a constant string. (Contributed by Serhiy Storchaka in bpo-38650.)

Removed

  • Exclude PyFPE_START_PROTECT() and PyFPE_END_PROTECT() macros of pyfpe.h from the limited C API. (Contributed by Victor Stinner in bpo-38835.)

  • The tp_print slot of PyTypeObject has been removed. It was used for printing objects to files in Python 2.7 and before. Since Python 3.0, it has been ignored and unused. (Contributed by Jeroen Demeyer in bpo-36974.)

  • Changes in the limited C API (if Py_LIMITED_API macro is defined):

    • Exclude the following functions from the limited C API:

      • _Py_CheckRecursionLimit

      • _Py_NewReference()

      • _Py_ForgetReference()

      • _PyTraceMalloc_NewReference()

      • _Py_GetRefTotal()

      • The trashcan mechanism which never worked in the limited C API.

      • PyTrash_UNWIND_LEVEL

      • Py_TRASHCAN_BEGIN_CONDITION

      • Py_TRASHCAN_BEGIN

      • Py_TRASHCAN_END

      • Py_TRASHCAN_SAFE_BEGIN

      • Py_TRASHCAN_SAFE_END

    • Move following functions and definitions to the internal C API:

      • _PyDebug_PrintTotalRefs()

      • _Py_PrintReferences()

      • _Py_PrintReferenceAddresses()

      • _Py_tracemalloc_config

      • _Py_AddToAllObjects() (specific to Py_TRACE_REFS build)

    (Contributed by Victor Stinner in bpo-38644 and bpo-39542.)

  • Remove _PyRuntime.getframe hook and remove _PyThreadState_GetFrame macro which was an alias to _PyRuntime.getframe. They were only exposed by the internal C API. Remove also PyThreadFrameGetter type. (Contributed by Victor Stinner in bpo-39946.)

  • Remove the following functions from the C API. Call PyGC_Collect() explicitly to clear all free lists. (Contributed by Inada Naoki and Victor Stinner in bpo-37340, bpo-38896 and bpo-40428.)

    • PyAsyncGen_ClearFreeLists()

    • PyContext_ClearFreeList()

    • PyDict_ClearFreeList()

    • PyFloat_ClearFreeList()

    • PyFrame_ClearFreeList()

    • PyList_ClearFreeList()

    • PyMethod_ClearFreeList() and PyCFunction_ClearFreeList(): the free lists of bound method objects have been removed.

    • PySet_ClearFreeList(): the set free list has been removed in Python 3.4.

    • PyTuple_ClearFreeList()

    • PyUnicode_ClearFreeList(): the Unicode free list has been removed in Python 3.3.

  • Remove _PyUnicode_ClearStaticStrings() function. (Contributed by Victor Stinner in bpo-39465.)