파이썬 3.9의 새로운 기능¶
- 편집자:
Łukasz Langa
This article explains the new features in Python 3.9, compared to 3.8. Python 3.9 was released on October 5, 2020. For full details, see the changelog.
더 보기
PEP 596 - 파이썬 3.9 출시 일정
요약 – 배포 주요 사항¶
새로운 문법 기능:
새로운 내장 기능:
PEP 616, 접두사와 접미사를 제거하는 문자열 메서드.
표준 라이브러리의 새로운 기능:
PEP 593, 유연한 함수와 변수 어노테이션;
경쟁과 시그널 없이 프로세스 관리를 허용하는
os.pidfd_open()
이 추가되었습니다.
인터프리터 개선:
PEP 573, C 확장형의 메서드에서 모듈 상태에 빠르게 액세스하기;
PEP 617, CPython은 이제 PEG를 기반으로 하는 새로운 구문 분석기를 사용합니다;
많은 파이썬 내장(range, tuple, set, frozenset, list, dict)이 이제 PEP 590 벡터콜을 사용하여 빨라졌습니다;
가비지 수거는 부활한 객체에서 블록 되지 않습니다;
a number of Python modules (
_abc
,audioop
,_bz2
,_codecs
,_contextvars
,_crypt
,_functools
,_json
,_locale
,math
,operator
,resource
,time
,_weakref
) now use multiphase initialization as defined by PEP 489;a number of standard library modules (
audioop
,ast
,grp
,_hashlib
,pwd
,_posixsubprocess
,random
,select
,struct
,termios
,zlib
) are now using the stable ABI defined by PEP 384.
새로운 라이브러리 모듈:
PEP 615, IANA 시간대 데이터베이스는 이제
zoneinfo
모듈을 통해 표준 라이브러리에 있습니다;이제 새로운
graphlib
모듈에서 그래프의 위상 정렬(topological sort) 구현이 제공됩니다.
릴리스 프로세스 변경:
PEP 602, CPython은 연간 릴리스 주기를 채택합니다.
여러분의 코드에서 DeprecationWarning을 확인해야합니다¶
파이썬 2.7이 여전히 지원될 때, 파이썬 2.7과의 과거 호환성을 위해 파이썬 3의 많은 기능이 유지되었습니다. 파이썬 2.7 지원이 종료되면서, 이러한 이전 버전과의 호환성 계층이 제거되었거나, 곧 제거될 예정입니다. 그들 대부분은 몇 년 동안 DeprecationWarning
경고를 내보냈습니다. 예를 들어, collections.abc.Mapping
대신 collections.Mapping
을 사용하면 2012년에 배포된 파이썬 3.3 이후 DeprecationWarning
을 내보냅니다.
-W
default
명령 줄 옵션으로 응용 프로그램을 테스트하여 DeprecationWarning
과 PendingDeprecationWarning
을 보십시오. 또는 -W
error
로 아예 에러로 취급하십시오. 경고 필터를 사용하면 제삼자 코드의 경고를 무시할 수 있습니다.
파이썬 3.9는 파이썬 프로젝트 지원 담당자가 파이썬 2 지원 제거를 구성하고 파이썬 3.9에 대한 지원을 추가할 수 있도록 더 많은 시간을 제공하기 위한, 파이썬 2 과거 호환성 계층을 제공하는 마지막 버전입니다.
collections
모듈의 추상 베이스 클래스에 대한 별칭(collections.abc.Mapping
에 대한 collections.Mapping
별칭과 같은)은 이전 버전과의 호환성을 위해 마지막 배포 하나에서 유지됩니다. 파이썬 3.10에서 제거됩니다.
더 일반적으로, 파이썬 개발 모드에서 테스트를 실행하면 다음 파이썬 버전과 호환되도록 코드를 준비하는 데 도움이 됩니다.
참고: 이 버전의 파이썬에서 기존의 많은 폐지가 제거되기도 했습니다. 제거 섹션을 참조하십시오.
새로운 기능¶
딕셔너리 병합과 업데이트 연산자¶
내장 dict
클래스에 병합(|
)과 업데이트(|=
) 연산자가 추가되었습니다. 이들은 딕셔너리 병합의 기존 dict.update
와 {**d1, **d2}
메서드를 보완합니다.
예:
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}
자세한 설명은 PEP 584를 참조하십시오. (Contributed by Brandt Bucher in bpo-36144.)
접두사와 접미사를 제거하는 새로운 문자열 메서드¶
문자열에서 불필요한 접두사나 접미사를 쉽게 제거하기 위해 str.removeprefix(prefix)
와 str.removesuffix(suffix)
가 추가되었습니다. 해당 bytes
, bytearray
및 collections.UserString
메서드도 추가되었습니다. 자세한 설명은 PEP 616을 참조하십시오. (Contributed by Dennis Sweeney in bpo-39939.)
표준 컬렉션의 형 힌트 제네릭¶
형 어노테이션에서 이제 typing
에서 해당 대문자 형(예를 들어 List
나 Dict
)을 임포트 하는 대신 list
와 dict
와 같은 내장 컬렉션 형을 제네릭 형으로 사용할 수 있습니다. 표준 라이브러리의 일부 다른 형도 이제 제네릭입니다, 예를 들어 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.)
새로운 구문 분석기¶
파이썬 3.9는 LL(1) 대신 PEG를 기반으로 하는 새로운 구문 분석기를 사용합니다. 새로운 구문 분석기의 성능은 기존 구문 분석기의 성능과 거의 비슷하지만, PEG 형식은 새로운 언어 기능을 설계할 때 LL(1)보다 더 유연합니다. 파이썬 3.10 이상에서 이 유연성을 사용하기 시작할 것입니다.
ast
모듈은 새 구문 분석기를 사용하며 이전 구문 분석기와 같은 AST를 생성합니다.
In Python 3.10, the old parser will be deleted and so will all
functionality that depends on it (primarily the parser
module,
which has long been deprecated). In Python 3.9 only, you can switch
back to the LL(1) parser using a command line switch (-X
oldparser
) or an environment variable (PYTHONOLDPARSER=1
).
자세한 내용은 PEP 617을 참조하십시오. (Contributed by Guido van Rossum, Pablo Galindo and Lysandros Nikolaou 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.)In the Python Development Mode and in debug build, the encoding and errors arguments are now checked for string encoding and decoding operations. Examples:
open()
,str.encode()
andbytes.decode()
.기본적으로, 최상의 성능을 위해, errors 인자는 첫 번째 인코딩/디코딩 에러에서만 확인되며 빈 문자열에 대해서는 encoding 인자가 무시되는 경우가 있습니다. (Contributed by Victor Stinner in bpo-37388.)
"".replace("", s, n)
는 이제 0이 아닌 모든n
에 대해 빈 문자열 대신s
를 반환합니다. 이제"".replace("", s)
와 일관성 있습니다.bytes
와bytearray
객체에 대해 유사한 변경 사항이 있습니다. (Contributed by Serhiy Storchaka in bpo-28029.)이제 모든 유효한 표현식을 데코레이터로 사용할 수 있습니다. 이전에는, 문법이 훨씬 제한적이었습니다. 자세한 내용은 PEP 614를 참조하십시오. (Contributed by Brandt Bucher in bpo-39702.)
typing
모듈에 대한 도움말이 개선되었습니다. 모든 특수 형식과 특수 제네릭 에일리어스(Union
과List
같은)에 대한 독스트링이 이제 표시됩니다.List[int]
와 같은 제네릭 에일리어스로help()
를 사용하면 해당 구상형(이 경우list
)에 대한 도움말이 표시됩니다. (Contributed by Serhiy Storchaka in bpo-40257.)aclose()
/asend()
/athrow()
의 병렬 실행은 이제 금지되며, 이제ag_running
은 비동기 제너레이터의 실제 실행 상태를 반영합니다. (Contributed by Yury Selivanov in bpo-30773.)__iter__
메서드 호출 시 예기치 않은 에러가 더는in
연산자와operator
모듈의contains()
,indexOf()
및countOf()
함수에서TypeError
에 의해 마스킹 되지 않습니다. (Contributed by Serhiy Storchaka in bpo-40824.)Unparenthesized lambda expressions can no longer be the expression part in an
if
clause in comprehensions and generator expressions. See bpo-41848 and bpo-43755 for details.
새 모듈¶
zoneinfo¶
zoneinfo
모듈은 IANA 시간대 데이터베이스 지원을 표준 라이브러리에 도입합니다. 시스템의 시간대 데이터로 뒷받침되는 구상 datetime.tzinfo
구현인 zoneinfo.ZoneInfo
를 추가합니다.
예:
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'
>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST
As a fall-back source of data for platforms that don’t ship the IANA database, the tzdata module was released as a first-party package – distributed via PyPI and maintained by the CPython core team.
더 보기
- PEP 615 – 표준 라이브러리의 IANA 시간대 데이터베이스에 대한 지원
Paul Ganssle이 작성하고 구현한 PEP
graphlib¶
graphlib.TopologicalSorter
클래스를 포함하는 graphlib
를 추가하여 그래프의 위상 정렬을 수행하는 기능을 제공합니다. (Contributed by Pablo Galindo, Tim Peters and Larry Hastings in bpo-17005.)
개선된 모듈¶
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.)
Added asyncio.PidfdChildWatcher
, a Linux-specific child watcher
implementation that polls process file descriptors. (bpo-38692)
새로운 코루틴 asyncio.to_thread()
를 추가했습니다. 주로 이벤트 루프 블록을 피하고자 별도의 스레드에서 IO 병목 함수를 실행하는 데 사용되며, 기본적으로 키워드 인자를 직접 취할 수 있는 run_in_executor()
의 고수준 버전으로 작동합니다. (Contributed by Kyle Stanley and Yury Selivanov in bpo-32309.)
시간 초과로 인해 태스크를 취소할 때, asyncio.wait_for()
는 이제 양의 timeout과 마찬가지로 timeout이 <= 0 인 경우에도 취소가 완료될 때까지 기다립니다. (Contributed by Elvis Pranskevichus in bpo-32751.)
asyncio
now raises TypeError
when calling incompatible
methods with an ssl.SSLSocket
socket.
(Contributed by Ido Michael in bpo-37404.)
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.)
ThreadPoolExecutor
와 ProcessPoolExecutor
에서 데몬 스레드를 제거했습니다. 이를 통해 종료 절차에서 서브 인터프리터와의 호환성과 예측성이 향상됩니다. (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¶
The isocalendar()
of datetime.date
and isocalendar()
of datetime.datetime
methods now returns a namedtuple()
instead of a tuple
.
(Contributed by Donghee Na in bpo-24416.)
distutils¶
upload 명령은 이제 SHA2-256 및 Blake2b-256 해시 다이제스트를 만듭니다. MD5 다이제스트를 차단하는 플랫폼에서는 MD5를 건너뜁니다. (Contributed by Christian Heimes in bpo-40698.)
fcntl¶
Added constants F_OFD_GETLK
, F_OFD_SETLK
and F_OFD_SETLKW
.
(Contributed by Donghee Na in bpo-38602.)
ftplib¶
FTP
and FTP_TLS
now raise a ValueError
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)
gc¶
가비지 수거기가 일부 객체를 되살리는 컬렉션을 만들 때 (파이널라이저가 실행된 후 격리된 순환 외부에서 도달할 수 있습니다), 여전히 도달할 수 없는 모든 객체의 컬렉션을 차단하지 않습니다. (Contributed by Pablo Galindo and Tim Peters in bpo-38379.)
가비지 수거기에서 객체가 파이널라이즈 되었는지 확인하는 새 함수 gc.is_finalized()
를 추가했습니다. (Contributed by Pablo Galindo in bpo-39322.)
hashlib¶
hashlib
모듈은 이제 사용할 수 있으면 OpenSSL의 SHA3 해시와 SHAKE XOF를 사용할 수 있습니다. (Contributed by Christian Heimes in bpo-37630.)
내장 해시 모듈은 이제 ./configure --without-builtin-hashlib-hashes
로 비활성화하거나 ./configure --with-builtin-hashlib-hashes=sha3,blake2
로 선택적으로 활성화하여 OpenSSL 기반 구현의 사용을 강제할 수 있습니다. (Contributed by Christian Heimes in bpo-40479)
http¶
HTTP status codes 103 EARLY_HINTS
, 418 IM_A_TEAPOT
and 425 TOO_EARLY
are added to
http.HTTPStatus
. (Contributed by Donghee Na in bpo-39509 and Ross Rhodes in bpo-39507.)
IDLE과 idlelib¶
커서 깜박임을 토글하는 옵션이 추가되었습니다. (Contributed by Zackery Spytz in bpo-4603.)
이스케이프 키는 이제 IDLE 완료 창을 닫습니다. (Contributed by Johnny Najera in bpo-38944.)
모듈 이름 완성 리스트에 키워드를 추가했습니다. (Contributed by Terry J. Reedy in bpo-37765.)
New in 3.9 maintenance releases
Make IDLE invoke sys.excepthook()
(when started without ‘-n’).
User hooks were previously ignored. (Contributed by Ken Hilton in
bpo-43008.)
위의 변경 사항은 3.8 유지 보수 릴리스로 역 이식되었습니다.
Rearrange the settings dialog. Split the General tab into Windows and Shell/Ed tabs. Move help sources, which extend the Help menu, to the Extensions tab. Make space for new options and shorten the dialog. The latter makes the dialog better fit small screens. (Contributed by Terry Jan Reedy in bpo-40468.) Move the indent space setting from the Font tab to the new Windows tab. (Contributed by Mark Roseman and Terry Jan Reedy in bpo-33962.)
Apply syntax highlighting to .pyi
files. (Contributed by Alex
Waygood and Terry Jan Reedy in bpo-45447.)
imaplib¶
IMAP4
and IMAP4_SSL
now have
an optional timeout parameter for their constructors.
Also, the open()
method now has an optional timeout parameter
with this change. The overridden methods of IMAP4_SSL
and
IMAP4_stream
were applied to this change.
(Contributed by Donghee Na in bpo-38615.)
imaplib.IMAP4.unselect()
is added.
imaplib.IMAP4.unselect()
frees server’s resources associated with the
selected mailbox and returns the server to the authenticated
state. This command performs the same actions as imaplib.IMAP4.close()
, except
that no messages are permanently removed from the currently
selected mailbox. (Contributed by Donghee Na in bpo-40375.)
importlib¶
import 문과의 일관성을 개선하기 위해, importlib.util.resolve_name()
은 이제 잘못된 상대 임포트 시도에 대해 ValueError
대신 ImportError
를 발생시킵니다. (Contributed by Ngalim Siregar in bpo-37444.)
불변 모듈 객체를 게시하는 임포트 로더는 이제 개별 모듈 외에도 불변 패키지를 게시할 수 있습니다. (Contributed by Dino Viehland in bpo-39336.)
importlib_resources
버전 1.5의 역 이식과 일치하는 패키지 데이터의 하위 디렉터리를 지원하는 importlib.resources.files()
함수가 추가되었습니다. (Contributed by Jason R. Coombs in bpo-39791.)
importlib_metadata
버전 1.6.1로부터 importlib.metadata
를 새로 고쳤습니다.
inspect¶
inspect.BoundArguments.arguments
가 OrderedDict
에서 일반 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.)
Starting with Python 3.9.5 the ipaddress
module no longer
accepts any leading zeros in IPv4 address strings.
(Contributed by Christian Heimes in bpo-36384).
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¶
NNTP
and NNTP_SSL
now raise a ValueError
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)
os¶
Added CLD_KILLED
and CLD_STOPPED
for si_code
.
(Contributed by Donghee Na in bpo-38493.)
Exposed the Linux-specific os.pidfd_open()
(bpo-38692) and
os.P_PIDFD
(bpo-38713) for process management with file
descriptors.
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¶
Added pathlib.Path.readlink()
which acts similarly to
os.readlink()
.
(Contributed by Girts Folkmanis in bpo-30618)
pdb¶
이제 윈도우에서 Pdb
는 ~/.pdbrc
를 지원합니다. (Contributed by Tim Hopper and Dan Lidral-Porter in bpo-20523.)
poplib¶
POP3
and POP3_SSL
now raise a ValueError
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)
pprint¶
pprint
는 이제 types.SimpleNamespace
를 예쁘게 인쇄 할 수 있습니다. (Contributed by Carl Bordum Hansen in bpo-37376.)
pydoc¶
The documentation string is now shown not only for class, function,
method etc, but for any object that has its own __doc__
attribute.
(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¶
SMTP
and SMTP_SSL
now raise a ValueError
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)
LMTP
constructor now has an optional timeout parameter.
(Contributed by Donghee Na in bpo-39329.)
socket¶
The socket
module now exports the CAN_RAW_JOIN_FILTERS
constant on Linux 4.1 and greater.
(Contributed by Stefan Tatschner and Zackery Spytz in bpo-25780.)
The socket module now supports the CAN_J1939
protocol on
platforms that support it. (Contributed by Karl Ding in bpo-40291.)
The socket module now has the socket.send_fds()
and
socket.recv_fds()
functions. (Contributed by Joannah Nanjekye, Shinya
Okano and Victor Stinner in bpo-28724.)
time¶
On AIX, thread_time()
is now implemented with thread_cputime()
which has nanosecond resolution, rather than
clock_gettime(CLOCK_THREAD_CPUTIME_ID)
which has a resolution of 10 milliseconds.
(Contributed by Batuhan Taskaya in bpo-40192)
sys¶
Added a new sys.platlibdir
attribute: name of the platform-specific
library directory. It is used to build the path of standard library and the
paths of installed extension modules. It is equal to "lib"
on most
platforms. On Fedora and SuSE, it is equal to "lib64"
on 64-bit platforms.
(Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)
Previously, sys.stderr
was block-buffered when non-interactive. Now
stderr
defaults to always being line-buffered.
(Contributed by Jendrik Seipp in bpo-13601.)
tracemalloc¶
특정 코드 조각의 최대 사용량을 측정하기 위해 추적한 메모리 블록의 최대 크기를 현재 크기로 설정하는 tracemalloc.reset_peak()
가 추가되었습니다. (Contributed by Huon Wilson in bpo-40630.)
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.)PyLong_FromDouble()
is now up to 1.87x faster for values that fit into long. (Contributed by Sergey Fedoseev in bpo-37986.)A number of Python builtins (
range
,tuple
,set
,frozenset
,list
,dict
) are now sped up by using PEP 590 vectorcall protocol. (Contributed by Donghee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in bpo-37207.)다른 집합이 기본 집합보다 훨씬 큰 경우에 최적화된
difference_update()
. (Suggested by Evgeny Kapun with code contributed by Michele Orrù in bpo-8425.)파이썬의 작은 객체 할당자(
obmalloc.c
)는 이제 하나의 빈 아레나를 OS로 반환하지 않고 즉시 재사용 할 수 있도록 허용합니다. 이렇게 하면 각 이터레이션마다 아레나가 새로 만들어지고 파괴될 수 있도록 하는 간단한 루프에서의 스레싱(thrashing)이 방지됩니다. (Contributed by Tim Peters in bpo-37257.)floor division of float operation now has a better performance. Also the message of
ZeroDivisionError
for this operation is updated. (Contributed by Donghee Na in bpo-39434.)UTF-8과 ascii 코덱으로 짧은 ASCII 문자열을 디코딩하는 것이 이제 약 15% 더 빨라졌습니다. (Contributed by Inada Naoki in bpo-37348.)
다음은 파이썬 3.4에서 파이썬 3.9까지의 성능 향상에 대한 요약입니다:
Python version 3.4 3.5 3.6 3.7 3.8 3.9
-------------- --- --- --- --- --- ---
Variable and attribute read access:
read_local 7.1 7.1 5.4 5.1 3.9 3.9
read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.5
read_global 15.5 19.0 14.3 13.6 7.6 7.8
read_builtin 21.1 21.6 18.5 19.0 7.5 7.8
read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 17.9
read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 16.9
read_instancevar 32.4 33.1 28.0 26.3 25.4 25.3
read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 20.5
read_namedtuple 73.8 57.5 45.0 46.8 18.4 18.7
read_boundmethod 37.6 37.9 29.6 26.9 27.7 41.1
Variable and attribute write access:
write_local 8.7 9.3 5.5 5.3 4.3 4.3
write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.8
write_global 19.7 21.2 18.0 18.0 15.8 16.7
write_classvar 92.9 96.0 104.6 102.1 39.2 39.8
write_instancevar 44.6 45.8 40.0 38.9 35.5 37.4
write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 25.8
Data structure read access:
read_list 24.2 24.5 20.8 20.8 19.0 19.5
read_deque 24.7 25.5 20.2 20.6 19.8 20.2
read_dict 24.3 25.7 22.3 23.0 21.0 22.4
read_strdict 22.6 24.3 19.5 21.2 18.9 21.5
Data structure write access:
write_list 27.1 28.5 22.5 21.6 20.0 20.0
write_deque 28.7 30.1 22.7 21.8 23.5 21.7
write_dict 31.4 33.3 29.3 29.2 24.7 25.4
write_strdict 28.4 29.9 27.5 25.2 23.1 24.5
Stack (or queue) operations:
list_append_pop 93.4 112.7 75.4 74.2 50.8 50.6
deque_append_pop 43.5 57.0 49.4 49.2 42.5 44.2
deque_append_popleft 43.7 57.3 49.7 49.7 42.8 46.4
Timing loop:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3
These results were generated from the variable access benchmark script at:
Tools/scripts/var_access_benchmark.py
. The benchmark script displays timings
in nanoseconds. The benchmarks were measured on an
Intel® Core™ i7-4960HQ processor
running the macOS 64-bit builds found at
python.org.
폐지¶
distutils
bdist_msi
명령은 이제 폐지되었습니다, 대신bdist_wheel
(휠 패키지)을 사용하십시오. (Contributed by Hugo van Kemenade in bpo-39586.)현재
math.factorial()
은 음이 아닌 정숫값을 갖는float
인스턴스를 허용합니다 (가령5.0
). 정숫값이 아니거나 음수인 float에 대해서는ValueError
를 발생시킵니다. 이제 폐지되었습니다. 향후 파이썬 버전에서는 모든 float에 대해TypeError
를 발생시킬 것입니다. (Contributed by Serhiy Storchaka in bpo-37315.)The
parser
andsymbol
modules are 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 theast
module.The Public C API functions
PyParser_SimpleParseStringFlags()
,PyParser_SimpleParseStringFlagsFilename()
,PyParser_SimpleParseFileFlags()
andPyNode_Compile()
are deprecated and will be removed in Python 3.10 together with the old parser.불리언 문맥에서
NotImplemented
를 사용하는 것은 거의 확실히 잘못된 풍부한 비교 구현의 결과이므로 폐지되었습니다. 향후 버전의 파이썬에서TypeError
가 될 것입니다. (Contributed by Josh Rosenberg in bpo-35712.)random
모듈은 현재 모든 해시 가능한 형을 시드 값으로 허용합니다. 불행히도, 이러한 형 중 일부는 결정론적 해시값을 보장하지 않습니다. 파이썬 3.9 이후, 이 모듈은 시드를None
,int
,float
,str
,bytes
및bytearray
로 제한합니다.mode 인자를 지정하지 않고 쓰기 위해
GzipFile
파일을 여는 것은 폐지되었습니다. 향후 파이썬 버전에서는 이때 기본적으로 항상 읽기 위해 열립니다. 쓰기 위해 열면서 경고가 나오지 않도록 하기 위해서는 mode 인자를 지정하십시오. (Contributed by Serhiy Storchaka in bpo-28286.)Deprecated the
split()
method of_tkinter.TkappType
in favour of thesplitlist()
method which has more consistent and predictable behavior. (Contributed by Serhiy Storchaka in bpo-38371.)코루틴 객체를
asyncio.wait()
에 명시적으로 전달하는 것은 폐지되었고 버전 3.11에서 제거됩니다. (Contributed by Yury Selivanov and Kyle Stanley in bpo-34790.)binhex4 and hexbin4 standards are now deprecated. The
binhex
module and the followingbinascii
functions are now deprecated:b2a_hqx()
,a2b_hqx()
rlecode_hqx()
,rledecode_hqx()
(Contributed by Victor Stinner in bpo-39353.)
ast
클래스slice
,Index
및ExtSlice
는 폐지된 것으로 간주하고 향후 파이썬 버전에서 제거될 예정입니다.Index(value)
대신value
자체를 사용해야 합니다.ExtSlice(slices)
대신Tuple(slices, Load())
를 사용해야 합니다. (Contributed by Serhiy Storchaka in bpo-34822.)ast
클래스Suite
,Param
,AugLoad
및AugStore
는 폐지된 것으로 간주하고 향후 파이썬 버전에서 제거될 예정입니다. 이것들은 구문 분석기에 의해 생성되지 않았으며 파이썬 3의 코드 생성기에 의해 받아들여지지 않았습니다. (Contributed by Batuhan Taskaya in bpo-39639 and bpo-39969 and Serhiy Storchaka in bpo-39988.)The
PyEval_InitThreads()
andPyEval_ThreadsInitialized()
functions are now deprecated and will be removed in Python 3.11. CallingPyEval_InitThreads()
now does nothing. The GIL is initialized byPy_Initialize()
since Python 3.7. (Contributed by Victor Stinner in bpo-39877.)shlex.split()
함수에 첫 번째 인자로None
을 전달하는 것은 폐지되었습니다. (Contributed by Zackery Spytz in bpo-33262.)smtpd.MailmanProxy()
is now deprecated as it is unusable without an external module,mailman
. (Contributed by Samuel Colvin in bpo-35800.)The
lib2to3
module now emits aPendingDeprecationWarning
. 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. Thelib2to3
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.)random.shuffle()
의 random 매개 변수는 폐지되었습니다. (Contributed by Raymond Hettinger in bpo-40465)
제거¶
The erroneous version at
unittest.mock.__version__
has been removed.nntplib.NNTP
:xpath()
andxgtitle()
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. Forxgtitle()
, please usenntplib.NNTP.descriptions()
ornntplib.NNTP.description()
instead. (Contributed by Donghee Na in bpo-39366.)array.array
:tostring()
과fromstring()
메서드가 제거되었습니다. 이것들은tobytes()
와frombytes()
의 별칭으로, 파이썬 3.2부터 폐지되었습니다. (Contributed by Victor Stinner in bpo-38916.)설명되지 않은
sys.callstats()
함수가 제거되었습니다. 파이썬 3.7부터는, 폐지되었고 항상None
을 반환했습니다. 파이썬 3.7에서 이미 제거된 특수 빌드 옵션CALL_PROFILE
이 필요했습니다. (Contributed by Victor Stinner in bpo-37414.)sys.getcheckinterval()
과sys.setcheckinterval()
함수가 제거되었습니다. 파이썬 3.2부터 폐지되었습니다. 대신sys.getswitchinterval()
과sys.setswitchinterval()
을 사용하십시오. (Contributed by Victor Stinner in bpo-37392.)C 함수
PyImport_Cleanup()
이 제거되었습니다. 이렇게 설명되어 있었습니다: “모듈 테이블을 비웁니다. 내부 전용.” (Contributed by Victor Stinner in bpo-36710.)_dummy_thread
와dummy_threading
모듈이 제거되었습니다. 이 모듈은 스레드 지원이 필수인 파이썬 3.7부터 폐지되었습니다. (Contributed by Victor Stinner in bpo-37312.)aifc.openfp()
alias toaifc.open()
,sunau.openfp()
alias tosunau.open()
, andwave.openfp()
alias towave.open()
have been removed. They were deprecated since Python 3.7. (Contributed by Victor Stinner in bpo-37320.)The
isAlive()
method ofthreading.Thread
has been removed. It was deprecated since Python 3.8. Useis_alive()
instead. (Contributed by Donghee Na in bpo-37804.)ElementTree
모듈에서 클래스ElementTree
와Element
의 메서드getchildren()
과getiterator()
가 제거되었습니다. 파이썬 3.2에서 폐지되었습니다.x.getchildren()
대신iter(x)
나list(x)
를,x.getiterator()
대신x.iter()
나list(x.iter())
를 사용하십시오. (Contributed by Serhiy Storchaka in bpo-36543.)낡은
plistlib
API는 제거되었습니다, 파이썬 3.4부터 폐지되었습니다.load()
,loads()
,dump()
및dumps()
함수를 사용하십시오. 또한, use_builtin_types 매개 변수가 제거되었으며, 표준bytes
객체가 항상 대신 사용됩니다. (Contributed by Jon Janzen in bpo-36409.)C 함수
PyGen_NeedsFinalizing
이 제거되었습니다. PEP 442를 구현한 후, 설명되지도, 테스트 되지도, CPython 내 어디에서건 사용되지도 않았습니다. Joannah Nanjekye의 패치. (Contributed by Joannah Nanjekye in bpo-15088)파이썬 3.1부터 폐지된 별칭
base64.encodestring()
과base64.decodestring()
은 제거되었습니다: 대신base64.encodebytes()
와base64.decodebytes()
를 사용하십시오. (Contributed by Victor Stinner in bpo-39351.)fractions.gcd()
함수가 제거되었습니다, 파이썬 3.5부터 폐지되었습니다 (bpo-22486): 대신math.gcd()
를 사용하십시오. (Contributed by Victor Stinner in bpo-39350.)bz2.BZ2File
의 buffering 매개 변수가 제거되었습니다. 파이썬 3.0부터 무시되었고 사용하면DeprecationWarning
을 방출했습니다. 파일을 여는 방법을 제어하려면 열린 파일 객체를 전달하십시오. (Contributed by Victor Stinner in bpo-39357.)json.loads()
의 encoding 매개 변수가 제거되었습니다. 파이썬 3.1부터 폐지되었고 무시되었습니다; 파이썬 3.8부터 사용하면DeprecationWarning
을 방출했습니다. (Contributed by Inada Naoki in bpo-39377)with (await asyncio.lock):
와with (yield from asyncio.lock):
문은 더는 지원되지 않습니다, 대신async with lock
을 사용하십시오.asyncio.Condition
과asyncio.Semaphore
도 마찬가지입니다. (Contributed by Andrew Svetlov in bpo-34793.)The
sys.getcounts()
function, the-X showalloccount
command line option and theshow_alloc_count
field of the C structurePyConfig
have been removed. They required a special Python build by definingCOUNT_ALLOCS
macro. (Contributed by Victor Stinner in bpo-39489.)typing.NamedTuple
클래스의_field_types
어트리뷰트가 제거되었습니다. 파이썬 3.8부터 폐지되었습니다. 대신__annotations__
어트리뷰트를 사용하십시오. (Contributed by Serhiy Storchaka in bpo-40182.)The
symtable.SymbolTable.has_exec()
method has been removed. It was deprecated since 2006, and only returningFalse
when it’s called. (Contributed by Batuhan Taskaya in bpo-40208)The
asyncio.Task.current_task()
andasyncio.Task.all_tasks()
have been removed. They were deprecated since Python 3.7 and you can useasyncio.current_task()
andasyncio.all_tasks()
instead. (Contributed by Rémi Lapeyre in bpo-40967)html.parser.HTMLParser
클래스의unescape()
메서드가 제거되었습니다 (파이썬 3.4부터 폐지되었습니다). 문자 참조를 해당 유니코드 문자로 변환하는 데html.unescape()
를 사용해야 합니다.
파이썬 3.9로 이식하기¶
이 절에서는 여러분의 코드 수정을 요구할 수도 있는 이전에 설명한 변경 사항과 다른 버그 수정 사항을 나열합니다.
파이썬 API의 변경¶
__import__()
와importlib.util.resolve_name()
은 이전에ValueError
를 발생시키던 곳에서 이제ImportError
를 발생시킵니다. 특정 예외 형을 포착하고 파이썬 3.9와 이전 버전을 모두 지원하는 호출자는except (ImportError, ValueError):
를 사용하여 둘 다 포착해야 합니다.__VENV_PROMPT__
가""
로 설정될 때venv
활성화 스크립트는 더는 특별한 경우가 아닙니다.The
select.epoll.unregister()
method no longer ignores theEBADF
error. (Contributed by Victor Stinner in bpo-39239.)buffering 매개 변수가 제거되었기 때문에,
bz2.BZ2File
의 compresslevel 매개 변수는 키워드 전용이 되었습니다. (Contributed by Victor Stinner in bpo-39357.)서브스크립션이 단순화된 AST. 단순 인덱스는 값으로 표시되고, 확장 슬라이스는 튜플로 표시됩니다.
Index(value)
는value
자체를 반환하고,ExtSlice(slices)
는Tuple(slices, Load())
를 반환합니다. (Contributed by Serhiy Storchaka in bpo-34822.)-E
나-I
명령 줄 옵션을 사용할 때importlib
모듈은 이제PYTHONCASEOK
환경 변수를 무시합니다.encoding 매개 변수가 클래스
ftplib.FTP
와ftplib.FTP_TLS
에 키워드 전용 매개 변수로 추가되었으며, 기본 인코딩이 RFC 2640을 따르도록 Latin-1에서 UTF-8로 변경되었습니다.asyncio.loop.shutdown_default_executor()
가AbstractEventLoop
에 추가되어서, 이것을 상속하는 대체 이벤트 루프에 이 메서드가 정의되어 있어야 합니다. (Contributed by Kyle Stanley in bpo-34037.)컴파일러 플래그와의 충돌을 방지하기 위해
__future__
모듈에서 퓨처 플래그의 상숫값이 갱신되었습니다. 이전에는PyCF_ALLOW_TOP_LEVEL_AWAIT
가CO_FUTURE_DIVISION
과 충돌했습니다. (Contributed by Batuhan Taskaya in bpo-39562)array('u')
now useswchar_t
as C type instead ofPy_UNICODE
. This change doesn’t affect to its behavior becausePy_UNICODE
is alias ofwchar_t
since Python 3.3. (Contributed by Inada Naoki in bpo-34538.)logging.getLogger()
API는 이제 이름'root'
를 전달할 때 루트 로거를 반환합니다. 이전에는'root'
라는 이름의 비 루트 로거를 반환했습니다. 이것은 사용자 코드가'root'
라는 이름의 루트가 아닌 로거를 명시적으로 원하거나,'root.py'
라는 최상위 모듈에서logging.getLogger(__name__)
을 사용하여 로거를 인스턴스 화하는 경우에 영향을 미칠 수 있습니다. (Contributed by Vinay Sajip in bpo-37742.)Division handling of
PurePath
now returnsNotImplemented
instead of raising aTypeError
when passed something other than an instance ofstr
orPurePath
. This allows creating compatible classes that don’t inherit from those mentioned types. (Contributed by Roger Aiudi in bpo-34775).Starting with Python 3.9.5 the
ipaddress
module no longer accepts any leading zeros in IPv4 address strings. Leading zeros are ambiguous and interpreted as octal notation by some libraries. For example the legacy functionsocket.inet_aton()
treats leading zeros as octal notatation. glibc implementation of moderninet_pton()
does not accept any leading zeros. (Contributed by Christian Heimes in bpo-36384).codecs.lookup()
now normalizes the encoding name the same way asencodings.normalize_encoding()
, except thatcodecs.lookup()
also converts the name to lower case. For example,"latex+latin1"
encoding name is now normalized to"latex_latin1"
. (Contributed by Jordon Xu in bpo-37751.)
C API의 변경¶
Instances of heap-allocated types (such as those created with
PyType_FromSpec()
and similar APIs) hold a reference to their type object since Python 3.8. As indicated in the “Changes in the C API” of Python 3.8, for the vast majority of cases, there should be no side effect but for types that have a customtp_traverse
function, ensure that all customtp_traverse
functions of heap-allocated types visit the object’s type.예:
int foo_traverse(foo_struct *self, visitproc visit, void *arg) { // Rest of the traverse function #if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (Python issue 35810 and 40217) Py_VISIT(Py_TYPE(self)); #endif }
If your traverse function delegates to
tp_traverse
of its base class (or another type), ensure thatPy_TYPE(self)
is visited only once. Note that only heap type are expected to visit the type intp_traverse
.예를 들어,
tp_traverse
함수가 다음을 포함하면:base->tp_traverse(self, visit, arg)
다음을 추가하십시오:
#if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (bpo-35810 and bpo-40217) if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { // a heap type's tp_traverse already visited Py_TYPE(self) } else { Py_VISIT(Py_TYPE(self)); } #else
PyEval_CallObject
,PyEval_CallFunction
,PyEval_CallMethod
및PyEval_CallObjectWithKeywords
함수는 폐지되었습니다. 대신PyObject_Call()
과 그 변형을 사용하십시오. (자세한 내용은 bpo-29548을 참조하십시오.)
CPython 바이트 코드 변경¶
The
LOAD_ASSERTION_ERROR
opcode was added for handling theassert
statement. Previously, the assert statement would not work correctly if theAssertionError
exception was being shadowed. (Contributed by Zackery Spytz in bpo-34880.)COMPARE_OP
옵코드는 4개의 개별 명령어로 분할되었습니다:풍부한 비교를 위한
COMPARE_OP
‘is’와 ‘is not’ 테스트를 위한
IS_OP
‘in’과 ‘not in’ 테스트를 위한
CONTAINS_OP
‘try-except’ 문에서 예외를 확인하기 위한
JUMP_IF_NOT_EXC_MATCH
.
(Contributed by Mark Shannon in bpo-39156.)
빌드 변경¶
Added
--with-platlibdir
option to theconfigure
script: name of the platform-specific library directory, stored in the newsys.platlibdir
attribute. Seesys.platlibdir
attribute for more information. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)COUNT_ALLOCS
특수 빌드 매크로가 제거되었습니다. (Contributed by Victor Stinner in bpo-39489.)On non-Windows platforms, the
setenv()
andunsetenv()
functions are now required to build Python. (Contributed by Victor Stinner in bpo-39395.)윈도우가 아닌 플랫폼에서,
bdist_wininst
설치 프로그램 생성은 이제 공식적으로 지원되지 않습니다. (자세한 내용은 bpo-10945를 참조하십시오.)When building Python on macOS from source,
_tkinter
now links with non-system Tcl and Tk frameworks if they are installed in/Library/Frameworks
, as had been the case on older releases of macOS. If a macOS SDK is explicitly configured, by using--enable-universalsdk
or-isysroot
, only the SDK itself is searched. The default behavior can still be overridden with--with-tcltk-includes
and--with-tcltk-libs
. (Contributed by Ned Deily in bpo-34956.)이제 윈도우 10 ARM64 용으로 파이썬을 빌드할 수 있습니다. (Contributed by Steve Dower in bpo-33125.)
--pgo
를 사용할 때 이제 일부 개별 테스트를 건너뜁니다. 문제의 테스트는 PGO 작업 시간을 매우 증가시켰으며 최종 실행 파일의 최적화를 개선하는 데 도움이 되지 않았을 가능성이 높습니다. 이렇게 하면 작업 속도가 약 15배 빨라집니다. 전체 단위 테스트 스위트를 실행하는 것은 느립니다. 이 변경으로 인해 많은 코드 분기가 실행되지 않아서 빌드가 약간 덜 최적화 될 수 있습니다. 훨씬 느린 빌드를 기다릴 의사가 있다면,./configure [..] PROFILE_TASK="-m test --pgo-extended"
를 사용하여 이전 동작을 복원할 수 있습니다. 우리는 어떤 PGO 작업 집합이 더 빠른 빌드를 생성하는지에 대해 보장하지 않습니다. 결과가 환경, 워크로드 및 컴파일러 도구 체인에 따라 달라질 수 있어서, 이를 중요하게 생각하는 사용자는 자신의 관련 벤치마크를 실행해야 합니다. (자세한 내용은 bpo-36044와 bpo-37707를 참조하십시오.)
C API 변경¶
새로운 기능¶
PEP 573: Added
PyType_FromModuleAndSpec()
to associate a module with a class;PyType_GetModule()
andPyType_GetModuleState()
to retrieve the module and its state; andPyCMethod
andMETH_METHOD
to allow a method to access the class it was defined in. (Contributed by Marcel Plch and Petr Viktorin in bpo-38787.)PyFrame_GetCode()
함수를 추가했습니다: 프레임 코드를 얻습니다.PyFrame_GetBack()
함수를 추가했습니다: 프레임 다음 외부 프레임을 얻습니다. (Contributed by Victor Stinner in bpo-40421.)제한된 C API에
PyFrame_GetLineNumber()
를 추가했습니다. (Contributed by Victor Stinner in bpo-40421.)인터프리터를 얻는
PyThreadState_GetInterpreter()
와PyInterpreterState_Get()
함수를 추가했습니다. 파이썬 스레드 상태의 현재 프레임을 가져오는PyThreadState_GetFrame()
함수를 추가했습니다.PyThreadState_GetID()
함수를 추가했습니다: 파이썬 스레드 상태의 고유 식별자를 가져옵니다. (Contributed by Victor Stinner in bpo-39947.)인자 없이 콜러블 파이썬 객체를 호출하는 새로운 공용
PyObject_CallNoArgs()
함수를 C API에 추가했습니다. 인자 없이 콜러블 파이썬 객체를 호출하는 가장 효율적인 방법입니다. (Contributed by Victor Stinner in bpo-37194.)제한된 C API의 변경 사항 (
Py_LIMITED_API
매크로가 정의된 경우):제한된 API에 대한 일반 함수로
Py_EnterRecursiveCall()
과Py_LeaveRecursiveCall()
을 제공합니다. 이전에는, 이들이 매크로로 정의되었지만, 이러한 매크로는PyThreadState.recursion_depth
필드에 액세스할 수 없는 제한된 C API로는 컴파일되지 않았습니다 (이 구조체는 제한된 C API에서 불투명합니다).PyObject_INIT()
와PyObject_INIT_VAR()
는 구현 세부 정보를 숨기도록 일반 “불투명” 함수가 됩니다.
The
PyModule_AddType()
function is added to help adding a type to a module. (Contributed by Donghee Na in bpo-40024.)PyObject_GC_IsTracked()
와PyObject_GC_IsFinalized()
함수를 공용 API에 추가하여 파이썬 객체가 현재 추적되고 있거나 가비지 수거기에 의해 이미 파이널라이즈 되었는지 조회할 수 있습니다. (Contributed by Pablo Galindo Salgado in bpo-40241.)Added
_PyObject_FunctionStr()
to get a user-friendly string representation of a function-like object. (Patch by Jeroen Demeyer in bpo-37645.)하나의 위치 인자로 객체를 호출하는
PyObject_CallOneArg()
를 추가했습니다 (Patch by Jeroen Demeyer in bpo-37483.)
파이썬 3.9로 이식하기¶
PyInterpreterState.eval_frame
(PEP 523)에는 이제 새로운 필수 tstate 매개 변수(PyThreadState*
)가 필요합니다. (Contributed by Victor Stinner in bpo-38500.)확장 모듈: 모듈 상태가 요청되었지만, 아직 할당되지 않았으면
PyModuleDef
의m_traverse
,m_clear
및m_free
함수가 더는 호출되지 않습니다. 이것은 모듈이 만들이진 직후, 모듈이 실행되기 직전의 경우입니다 (Py_mod_exec
함수). 더 정확하게는,m_size
가 0보다 크고 모듈 상태(PyModule_GetState()
가 반환하는)가NULL
이면 이 함수가 호출되지 않습니다.모듈 상태가 없는 확장 모듈(
m_size <= 0
)은 영향을 받지 않습니다.서브 인터프리터에서
Py_AddPendingCall()
이 호출되면, 함수는 이제 메인 인터프리터에서 호출되지 않고 서브 인터프리터에서 호출되도록 예약됩니다. 각 서브 인터프리터는 이제 자체 예약된 호출 목록을 갖습니다. (Contributed by Victor Stinner in bpo-39984.)-E
옵션이 사용될 때 (PyConfig.use_environment
가0
으로 설정될 때) 윈도우 레지스트리가 더는sys.path
를 초기화하는 데 사용되지 않습니다. 이것은 윈도우에서 파이썬을 내장할 때 중요합니다. (Contributed by Zackery Spytz in bpo-8901.)전역 변수
PyStructSequence_UnnamedField
는 이제 상수이며 상수 문자열을 참조합니다. (Contributed by Serhiy Storchaka in bpo-38650.)The
PyGC_Head
structure is now opaque. It is only defined in the internal C API (pycore_gc.h
). (Contributed by Victor Stinner in bpo-40241.)The
Py_UNICODE_COPY
,Py_UNICODE_FILL
,PyUnicode_WSTR_LENGTH
,PyUnicode_FromUnicode()
,PyUnicode_AsUnicode()
,_PyUnicode_AsUnicode
, andPyUnicode_AsUnicodeAndSize()
are marked as deprecated in C. They have been deprecated by PEP 393 since Python 3.3. (Contributed by Inada Naoki in bpo-36346.)Py_FatalError()
함수는,Py_LIMITED_API
매크로가 정의되지 않는 한, 현재 함수의 이름을 자동으로 로그 하는 매크로로 대체됩니다. (Contributed by Victor Stinner in bpo-39882.)벡터콜 프로토콜은 이제 호출자가 키워드 이름으로 문자열만 전달하도록 요구합니다. (자세한 내용은 bpo-37540을 참조하십시오.)
이제 여러 매크로와 함수의 구현 세부 사항이 숨겨집니다:
PyObject_IS_GC()
매크로가 함수로 변환되었습니다.The
PyObject_NEW()
macro becomes an alias to thePyObject_New
macro, and thePyObject_NEW_VAR()
macro becomes an alias to thePyObject_NewVar
macro. They no longer access directly thePyTypeObject.tp_basicsize
member.PyObject_GET_WEAKREFS_LISTPTR()
macro was converted to a function: the macro accessed directly thePyTypeObject.tp_weaklistoffset
member.PyObject_CheckBuffer()
매크로가 함수로 변환되었습니다: 매크로는PyTypeObject.tp_as_buffer
멤버에 직접 액세스했습니다.PyIndex_Check()
는 이제 구현 세부 사항을 숨기기 위해 항상 불투명한 함수로 선언됩니다:PyIndex_Check()
매크로가 제거되었습니다. 매크로는PyTypeObject.tp_as_number
멤버에 직접 액세스했습니다.
(자세한 내용은 bpo-40170을 참조하십시오.)
제거¶
제한된 C API에서
pyfpe.h
의PyFPE_START_PROTECT()
와PyFPE_END_PROTECT()
매크로를 제외했습니다. (Contributed by Victor Stinner in bpo-38835.)PyTypeObject의
tp_print
슬롯이 제거되었습니다. 파이썬 2.7과 이전 버전에서 파일로 객체를 인쇄하는 데 사용되었습니다. 파이썬 3.0부터는, 무시되고 사용되지 않았습니다. (Contributed by Jeroen Demeyer in bpo-36974.)제한된 C API의 변경 사항 (
Py_LIMITED_API
매크로가 정의된 경우):제한된 C API에서 다음 함수를 제외했습니다:
PyThreadState_DeleteCurrent()
(Contributed by Joannah Nanjekye in bpo-37878.)_Py_CheckRecursionLimit
_Py_NewReference()
_Py_ForgetReference()
_PyTraceMalloc_NewReference()
_Py_GetRefTotal()
제한된 C API에서 결코 작동하지 않은 휴지통 메커니즘.
PyTrash_UNWIND_LEVEL
Py_TRASHCAN_BEGIN_CONDITION
Py_TRASHCAN_BEGIN
Py_TRASHCAN_END
Py_TRASHCAN_SAFE_BEGIN
Py_TRASHCAN_SAFE_END
다음 함수와 정의를 내부 C API로 옮겼습니다:
_PyDebug_PrintTotalRefs()
_Py_PrintReferences()
_Py_PrintReferenceAddresses()
_Py_tracemalloc_config
_Py_AddToAllObjects()
(Py_TRACE_REFS
빌드에만 해당)
_PyRuntime.getframe
훅을 제거했고_PyRuntime.getframe
의 별칭인_PyThreadState_GetFrame
매크로를 제거했습니다. 이들은 내부 C API에 의해서만 노출되었습니다.PyThreadFrameGetter
형도 제거했습니다. (Contributed by Victor Stinner in bpo-39946.)C API에서 다음 함수를 제거했습니다. 모든 자유 목록을 지우려면
PyGC_Collect()
를 명시적으로 호출하십시오. (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()
와PyCFunction_ClearFreeList()
: 연결된 메서드 객체의 자유 목록이 제거되었습니다.PySet_ClearFreeList()
: 파이썬 3.4에서 집합 자유 목록이 제거되었습니다.PyTuple_ClearFreeList()
PyUnicode_ClearFreeList()
: 파이썬 3.3에서 유니코드 자유 목록이 제거되었습니다.
_PyUnicode_ClearStaticStrings()
함수를 제거했습니다. (Contributed by Victor Stinner in bpo-39465.)Py_UNICODE_MATCH
를 제거했습니다. PEP 393에서 폐지되었고, 파이썬 3.3부터 망가졌습니다. 대신PyUnicode_Tailmatch()
함수를 사용할 수 있습니다. (Contributed by Inada Naoki in bpo-36346.)정의되었지만 구현이 없는 헤더 파일들을 정리했습니다. 제거되는 공용 API 심볼은:
_PyBytes_InsertThousandsGroupingLocale
,_PyBytes_InsertThousandsGrouping
,_Py_InitializeFromArgs
,_Py_InitializeFromWideArgs
,_PyFloat_Repr
,_PyFloat_Digits
,_PyFloat_DigitsInit
,PyFrame_ExtendStack
,_PyAIterWrapper_Type
,PyNullImporter_Type
,PyCmpWrapper_Type
,PySortWrapper_Type
,PyNoArgsFunction
입니다. (Contributed by Pablo Galindo Salgado in bpo-39372.)
파이썬 3.9.1의 주목할만한 변경 사항¶
typing¶
typing.Literal
의 동작은 PEP 586를 따르고 PEP에 지정된 정적 형 검사기의 동작과 일치하도록 변경되었습니다.
Literal
은 이제 매개 변수를 중복 제거합니다.Literal
객체 간의 동등 비교는 이제 순서에 독립적입니다.Literal
비교는 이제 형을 존중합니다. 예를 들어,Literal[0] == Literal[False]
는 이전에True
로 평가되었습니다. 이제False
입니다. 이 변경을 지원하기 위해, 내부적으로 사용되는 형 캐시는 이제 형 구분을 지원합니다.Literal
objects will now raise aTypeError
exception during equality comparisons if any of their parameters are not hashable. Note that declaringLiteral
with mutable parameters will not throw an error:>>> from typing import Literal >>> Literal[{0}] >>> Literal[{0}] == Literal[{False}] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'set'
(Contributed by Yurii Karabas in bpo-42345.)
macOS 11.0 (Big Sur) 및 Apple Silicon Mac 지원¶
3.9.1부터, 파이썬은 이제 macOS 11.0 (Big Sur)과 Apple Silicon Mac(ARM64
아키텍처 기반)에서 빌드와 실행을 완전히 지원합니다. 이제 새로운 유니버설 빌드 변형인 universal2
를 사용하여 하나의 실행 파일 집합에서 ARM64
와 Intel 64
를 모두 네이티브 하게 지원할 수 있습니다. 바이너리는 이제 현재 버전의 macOS에서 빌드되어 다양한 이전 macOS 버전(10.9까지 테스트 되었습니다)에 배포되는 동시에 실행시간에 사용 중인 운영 체제 버전에 따라 조건부로 사용 가능한 일부 새로운 OS 기능과 옵션을 만들 수 있습니다 (“약한 링크(weaklinking)”).
(Contributed by Ronald Oussoren and Lawrence D’Anna in bpo-41100.)
파이썬 3.9.2의 주목할만한 변경 사항¶
collections.abc¶
collections.abc.Callable
제네릭은 이제 typing.Callable
이 현재 수행하는 것과 유사하게 형 매개 변수를 평활화합니다. 이것은 collections.abc.Callable[[int, str], str]
의 __args__
가 (int, str, str)
임을 의미합니다; 이전에는 ([int, str], str)
였습니다. 이러한 변경을 허용하기 위해, 이제 types.GenericAlias
를 서브 클래싱할 수 있으며, collections.abc.Callable
형을 서브스크립팅할 할 때 서브 클래스가 반환됩니다. typing.get_args()
나 __args__
를 통해 인자에 액세스하는 코드는 이 변경 사항을 고려해야 합니다. 파이썬 3.9.1에서 조용히 전달되었을 수 있는 collections.abc.Callable
의 유효하지 않은 매개 변수화 형식에 대해 DeprecationWarning
을 방출할 수 있습니다. 이 DeprecationWarning
은 파이썬 3.10에서 TypeError
가 됩니다. (Contributed by Ken Jin in bpo-42195.)
urllib.parse¶
Earlier Python versions allowed using both ;
and &
as
query parameter separators in urllib.parse.parse_qs()
and
urllib.parse.parse_qsl()
. Due to security concerns, and to conform with
newer W3C recommendations, this has been changed to allow only a single
separator key, with &
as the default. This change also affects
cgi.parse()
and cgi.parse_multipart()
as they use the affected
functions internally. For more details, please see their respective
documentation.
(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967.)
파이썬 3.9.3의 주목할만한 변경 사항¶
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)
Notable changes in Python 3.9.5¶
urllib.parse¶
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 in 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)
Notable security feature in 3.9.14¶
Converting between int
and str
in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a ValueError
if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for CVE 2020-10735.
This limit can be configured or disabled by environment variable, command
line flag, or sys
APIs. See the integer string conversion
length limitation documentation. The default limit
is 4300 digits in string form.
Notable changes in 3.9.17¶
tarfile¶
The extraction methods in
tarfile
, andshutil.unpack_archive()
, have a new a filter argument that allows limiting tar features than may be surprising or dangerous, such as creating files outside the destination directory. See Extraction filters for details. In Python 3.12, use without the filter argument will show aDeprecationWarning
. In Python 3.14, the default will switch to'data'
. (Contributed by Petr Viktorin in PEP 706.)