Python 3.10의 새로운 기능¶
- 편집자:
파블로 갈린도 살가도
이 기사에서는 3.9와 비교하여 Python 3.10의 새로운 기능에 대해 설명합니다. Python 3.10은 2021년 10월 4일에 출시되었습니다. 자세한 내용은 변경 내역 을 참조하십시오.
요약 – 릴리스 하이라이트¶
새로운 문법 기능:
PEP 634, 구조적 패턴 매칭: 명세
PEP 635, 구조적 패턴 매칭: 동기 및 근거
PEP 636, 구조적 패턴 매칭: 튜토리얼
bpo-12782, 이제 괄호로 감싼 컨텍스트 관리자가 공식적으로 허용됩니다.
표준 라이브러리의 새로운 기능:
PEP 618, zip에 선택적 길이 검사 추가
인터프리터 개선 사항:
PEP 626, 디버깅 및 기타 도구를 위한 정확한 줄 번호
새로운 타이핑 기능:
중요한 폐지, 제거 또는 제한 사항:
새로운 기능들¶
괄호로 감싼 컨텍스트 관리자¶
컨텍스트 관리자에서 여러 줄에 걸쳐 이어지는 문장을 위해 감싸는 괄호를 사용하는 것이 이제 지원됩니다. 이를 통해 이전에 import 문과 유사하게 가능했던 것처럼 긴 컨텍스트 관리자 모음을 여러 줄에 걸쳐 포맷팅할 수 있습니다. 예를 들어, 다음의 모든 예시가 이제 유효합니다.
with (CtxManager() as example):
...
with (
CtxManager1(),
CtxManager2()
):
...
with (CtxManager1() as example,
CtxManager2()):
...
with (CtxManager1(),
CtxManager2() as example):
...
with (
CtxManager1() as example1,
CtxManager2() as example2
):
...
또한 괄호로 감싼 그룹 끝에 꼬리 쉼표를 사용할 수도 있습니다.
with (
CtxManager1() as example1,
CtxManager2() as example2,
CtxManager3() as example3,
):
...
이 새로운 구문은 새 파서의 비(non) LL(1) 역량을 활용합니다. 자세한 내용은 PEP 617 을 참조하십시오.
(Guido van Rossum, Pablo Galindo 및 Lysandros Nikolaou가 bpo-12782 및 bpo-40334 에서 기여함.)
개선된 오류 메시지¶
구문 오류(SyntaxErrors)¶
닫히지 않은 괄호나 대괄호가 포함된 코드를 파싱할 때, 인터프리터는 이제 ***SyntaxError: unexpected EOF while parsing* 를 표시하거나 잘못된 위치를 가리키는 대신 닫히지 않은 괄호/대괄호의 위치를 포함합니다. 예를 들어, 다음 코드(닫히지 않은 ‘{‘에 주목하십시오)를 살펴보십시오.
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
some_other_code = foo()
이전 버전의 인터프리터는 구문 오류의 위치로 혼란스러운 곳을 보고했습니다.
File "example.py", line 3
some_other_code = foo()
^
SyntaxError: invalid syntax
그러나 Python 3.10에서는 더 유용한 정보가 포함된 에러가 발생합니다.
File "example.py", line 1
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
^
SyntaxError: '{' was never closed
유사한 방식으로, 닫히지 않은 문자열 리터럴(홑따옴표 및 삼중따옴표)과 관련된 오류는 이제 EOF/EOL을 보고하는 대신 문자열의 시작 지점을 가리킵니다.
이러한 개선 사항은 PyPy 인터프리터에서의 이전 작업에서 영감을 받았습니다.
(Pablo Galindo가 bpo-42864 에서, Batuhan Taskaya가 bpo-40176 에서 기여함.)
인터프리터에 의해 발생되는 SyntaxError 예외는 이제 문제가 감지된 지점만 표시하는 대신 구문 오류를 구성하는 표현식의 전체 오류 범위를 강조합니다. 이 방식으로, Python 3.10 이전과 달리 다음과 같이 표시됩니다:
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized
이제 Python 3.10은 예외를 다음과 같이 표시합니다.
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
이 개선 사항은 Pablo Galindo가 bpo-43914 에서 기여했습니다.
SyntaxError 예외에 대한 상당한 양의 새로운 전용 메시지가 통합되었습니다. 가장 주목할 만한 것 중 일부는 다음과 같습니다.
블록 앞에 누락된
::>>> if rocket.position > event_horizon File "<stdin>", line 1 if rocket.position > event_horizon ^ SyntaxError: expected ':'
(Pablo Galindo가 bpo-42997 에서 기여함.)
컴프리헨션 대상에 있는 괄호 없는 튜플:
>>> {x,y for x,y in zip('abcd', '1234')} File "<stdin>", line 1 {x,y for x,y in zip('abcd', '1234')} ^ SyntaxError: did you forget parentheses around the comprehension target?
(Pablo Galindo가 bpo-43017 에서 기여함.)
컬렉션 리터럴 및 표현식 사이의 누락된 쉼표:
>>> items = { ... x: 1, ... y: 2 ... z: 3, File "<stdin>", line 3 y: 2 ^ SyntaxError: invalid syntax. Perhaps you forgot a comma?
(Pablo Galindo가 bpo-43822 에서 기여함.)
괄호 없는 다중 예외 유형:
>>> try: ... build_dyson_sphere() ... except NotEnoughScienceError, NotEnoughResourcesError: File "<stdin>", line 3 except NotEnoughScienceError, NotEnoughResourcesError: ^ SyntaxError: multiple exception types must be parenthesized
(Pablo Galindo가 bpo-43149 에서 기여함.)
딕셔너리 리터럴에서 누락된
:및 값:>>> values = { ... x: 1, ... y: 2, ... z: ... } File "<stdin>", line 4 z: ^ SyntaxError: expression expected after dictionary key and ':' >>> values = {x:1, y:2, z w:3} File "<stdin>", line 1 values = {x:1, y:2, z w:3} ^ SyntaxError: ':' expected after dictionary key
(Pablo Galindo가 bpo-43823 에서 기여함.)
except또는finally블록이 없는try블록:>>> try: ... x = 2 ... something = 3 File "<stdin>", line 3 something = 3 ^^^^^^^^^ SyntaxError: expected 'except' or 'finally' block
(Pablo Galindo가 bpo-44305 에서 기여함.)
비교 시
==대신=사용:>>> if rocket.position = event_horizon: File "<stdin>", line 1 if rocket.position = event_horizon: ^ SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
(Pablo Galindo가 bpo-43797 에서 기여함.)
f-문자열 내에서의
*사용:>>> f"Black holes {*all_black_holes} and revelations" File "<stdin>", line 1 (*all_black_holes) ^ SyntaxError: f-string: cannot use starred expression here
(Pablo Galindo가 bpo-41064 에서 기여함.)
들여쓰기 오류(IndentationErrors)¶
많은 IndentationError 예외가 이제 들여쓰기가 필요한 블록의 종류와 구문의 위치를 포함하여 더 많은 정보를 제공합니다.
>>> def foo():
... if lel:
... x = 2
File "<stdin>", line 3
x = 2
^
IndentationError: expected an indented block after 'if' statement in line 2
속성 오류(AttributeErrors)¶
AttributeError`를 출력할 때, :c:func:!PyErr_Display`는 예외가 발생한 객체 내에서 유사한 속성 이름을 제안합니다.
>>> collections.namedtoplo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?
(Pablo Galindo가 bpo-38530 에서 기여함.)
경고
다른 커스텀 에러 출력 함수를 사용하여 오류를 표시할 때처럼 PyErr_Display() 가 호출되지 않는 경우에는 이 기능이 작동하지 않을 수 있습니다. 이는 IPython과 같은 일부 REPL에서 흔히 발생하는 시나리오입니다.
NameError¶
인터프리터에 의해 발생한 NameError`를 출력할 때, :c:func:!PyErr_Display`는 예외가 발생한 함수 내의 유사한 변수 이름을 제안합니다.
>>> schwarzschild_black_hole = None
>>> schwarschild_black_hole
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?
(Pablo Galindo가 bpo-38530 에서 기여함.)
경고
다른 커스텀 에러 출력 함수를 사용하여 오류를 표시할 때처럼 PyErr_Display() 가 호출되지 않는 경우에는 이 기능이 작동하지 않을 수 있습니다. 이는 IPython과 같은 일부 REPL에서 흔히 발생하는 시나리오입니다.
PEP 626: 디버깅 및 기타 도구를 위한 정확한 라인 번호¶
PEP 626은 디버깅, 프로파일링 및 커버리지 도구를 위해 더욱 정확하고 신뢰할 수 있는 라인 번호를 제공합니다. 올바른 라인 번호가 포함된 트레이싱 이벤트는 실행된 모든 코드 줄에 대해 생성되며, 오직 실제로 실행된 코드 줄에 대해서만 생성됩니다.
프레임 객체의 f_lineno 어트리뷰트는 항상 예상되는 라인 번호를 포함합니다.
코드 객체 <code-objects>`의 :attr:!codeobject.co_lnotab` 어트리뷰트는 더 이상 권장되지 않으며(deprecated) 3.12 버전에서 삭제될 예정입니다. 오프셋을 라인 번호로 변환해야 하는 코드는 대신 새로운 co_lines() 메서드를 사용해야 합니다.
PEP 634: 구조적 패턴 매칭¶
구조적 패턴 매칭은 match 문*과 연관된 동작을 가진 패턴의 *case 문 형태로 추가되었습니다. 패턴은 시퀀스, 매핑, 원시 데이터 타입뿐만 아니라 클래스 인스턴스로 구성됩니다. 패턴 매칭을 통해 프로그램은 복잡한 데이터 유형에서 정보를 추출하고, 데이터 구조에 따라 분기하며, 다양한 형태의 데이터에 기반하여 특정 동작을 적용할 수 있습니다.
문법 및 연산¶
패턴 매칭의 일반적인 구문은 다음과 같습니다:
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _:
<action_wildcard>
match 문은 식을 받아 하나 이상의 case 블록으로 제공되는 연속적인 패턴과 그 값을 비교합니다. 구체적으로 패턴 매칭은 다음과 같이 작동합니다:
타입과 형태를 가진 데이터(
대상(subject))를 사용match문 내의대상(subject)평가매칭이 확인될 때까지
case문의 각 패턴과 대상을 위에서부터 아래로 비교확인된 매치의 패턴과 연결된 동작 실행
정확한 매치가 확인되지 않으면 제공된 마지막 케이스인 와일드카드
_가 매칭용 케이스로 사용됩니다. 정확한 매치가 없고 와일드카드 케이스도 없는 경우, 전체 match 블록은 아무런 동작도 수행하지 않습니다(no-op).
선언적 접근 방식¶
독자들은 C, Java 또는 JavaScript(및 다른 많은 언어)에서 볼 수 있는 switch 문을 통해 대상(데이터 객체)을 리터럴(패턴)과 매칭하는 간단한 예시를 통해 패턴 매칭에 익숙할 수 있습니다. 흔히 switch 문은 리터럴을 포함하는 case 문과 객체/표현식을 비교하는 데 사용됩니다.
더 강력한 패턴 매칭 예제는 Scala나 Elixir와 같은 언어에서 찾을 수 있습니다. 구조적 패턴 매칭에서는 접근 방식이 “선언적”이며 데이터가 일치하기 위한 조건(패턴)을 명시적으로 기술합니다.
중첩된 “if” 문을 사용하는 “명령형” 일련의 명령으로 구조적 패턴 매칭과 유사한 것을 수행할 수 있지만, 이는 “선언적” 접근 방식보다 명확성이 떨어집니다. 대신 “선언적” 방식은 매칭을 위해 충족해야 하는 조건을 기술하며 명시적인 패턴을 통해 가독성이 더 좋습니다. 구조적 패턴 매칭이 case 문에서 변수를 리터럴과 비교하는 가장 단순한 형태로 사용될 수도 있지만, 파이썬에서 이 기능의 진정한 가치는 대상의 타입과 형태를 처리하는 데 있습니다.
단순한 패턴: 리터럴과 매칭¶
가장 단순한 형태의 패턴 매칭인 다음 예시를 살펴보겠습니다. 값이 포함된 대상(subject)이 여러 리터럴인 패턴들과 매치됩니다. 아래 예제에서 status 는 match 문의 대상입니다. 패턴은 각 case 문이며, 리터럴은 요청 상태 코드를 나타냅니다. 매치가 성공하면 해당 케이스와 연결된 동작이 실행됩니다:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
위 함수에 status 로 418이 전달되면 “I’m a teapot”이 반환됩니다. 만약 위 함수에 status 로 500이 전달되면, _ 를 포함한 case 문이 와일드카드로 매칭되어 “Something’s wrong with the internet”가 반환됩니다. 마지막 블록을 주목하십시오. 변수 이름인 _ 는 와일드카드 역할을 하여 대상이 항상 매칭되도록 보장합니다. _ 의 사용은 선택 사항입니다.
| (“or”)를 사용하여 하나의 패턴 내에서 여러 리터럴을 결합할 수 있습니다:
case 401 | 403 | 404:
return "Not allowed"
와일드카드가 없는 경우의 동작¶
위 예제에서 마지막 케이스 블록을 제거하여 수정하면 다음과 같이 변경됩니다:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case 문에서 _ 를 사용하지 않으면 매칭 결과가 없을 수 있습니다. 매칭이 존재하지 않는 경우 동작은 아무것도 수행하지 않습니다(no-op). 예를 들어, status 로 500이 전달되면 no-op이 발생합니다.
리터럴과 변수가 포함된 패턴¶
패턴은 언패킹 할당과 유사하게 보일 수 있으며, 변수를 바인딩하는 데 사용될 수 있습니다. 이 예제에서 데이터 포인트는 x 좌표와 y 좌표로 언패킹될 수 있습니다:
\# point는 (x, y) 튜플입니다.
match point:
case (0, 0):
print("Origin")
case (0, y):
print(f"Y={y}")
case (x, 0):
print(f"X={x}")
case (x, y):
print(f"X={x}, Y={y}")
case _:
raise ValueError("Not a point")
첫 번째 패턴은 두 개의 리터럴인 (0, 0) 을 포함하며, 위에서 보여준 리터럴 패턴의 확장으로 생각할 수 있습니다. 다음 두 패턴은 리터럴과 변수를 결합하며, 여기서 변수는 대상(point)으로부터 값을 바인딩 합니다. 네 번째 패턴은 두 개의 값을 캡처하므로 개념적으로 언패킹 할당 (x, y) = point 와 유사합니다.
패턴과 클래스¶
데이터를 구조화하기 위해 클래스를 사용하는 경우, 생성자와 유사한 인수 목록이 뒤따르는 클래스 이름을 패턴으로 사용할 수 있습니다. 이 패턴은 인스턴스 속성을 변수로 캡처하는 능력이 있습니다:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def location(point):
match point:
case Point(x=0, y=0):
print("Origin is the point's location.")
case Point(x=0, y=y):
print(f"Y={y} and the point is on the y-axis.")
case Point(x=x, y=0):
print(f"X={x} and the point is on the x-axis.")
case Point():
print("The point is located somewhere else on the plane.")
case _:
print("Not a point")
위치 매개변수가 포함된 패턴¶
속성에 대한 순서를 제공하는 일부 내장 클래스(예: dataclasses)의 경우 위치 매개변수를 사용할 수 있습니다. 또한, 클래스의 __match_args__ 특수 속성을 설정하여 패턴에서 속성의 특정 위치를 정의할 수 있습니다. 이를 (“x”, “y”)로 설정하면 다음 패턴들은 모두 동일하며(그리고 모두 y 속성을 var 변수에 바인딩함):
Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)
중첩된 패턴¶
패턴은 임의로 중첩될 수 있습니다. 예를 들어 데이터가 짧은 포인트 목록인 경우 다음과 같이 매칭할 수 있습니다:
match points:
case []:
print("No points in the list.")
case [Point(0, 0)]:
print("The origin is the only point in the list.")
case [Point(x, y)]:
print(f"A single point {x}, {y} is in the list.")
case [Point(0, y1), Point(0, y2)]:
print(f"Two points on the Y axis at {y1}, {y2} are in the list.")
case _:
print("Something else is found in the list.")
복잡한 패턴과 와일드카드¶
지금까지의 예제에서는 마지막 케이스 문에서 단독으로 _ 를 사용했습니다. 와일드카드는 ('error', code, _) 와 같이 더 복잡한 패턴에서도 사용할 수 있습니다. 예를 들면:
match test_variable:
case ('warning', code, 40):
print("A warning has been received.")
case ('error', code, _):
print(f"An error {code} occurred.")
위의 경우에서 test_variable 은 (‘error’, code, 100)과 (‘error’, code, 800)에 대해 매치됩니다.
가드(Guard)¶
패턴에 “가드”라고 알려진 if 절을 추가할 수 있습니다. 가드가 거짓이면, match 는 다음 케이스 블록을 시도합니다. 값 캡처는 가드가 평가되기 전에 발생한다는 점에 유의하십시오:
match point:
case Point(x, y) if x == y:
print(f"The point is located on the diagonal Y=X at {x}.")
case Point(x, y):
print(f"Point is not on the diagonal.")
기타 주요 기능¶
몇 가지 다른 주요 기능:
언패킹 할당과 마찬가지로 튜플 및 리스트 패턴은 정확히 동일한 의미를 가지며 실제로는 임의의 시퀀스를 매칭합니다. 엄격하게 말하면 대상은 시퀀스여야 합니다. 따라서 중요한 예외 사항으로, 패턴은 반복자(iterator)와는 매치되지 않습니다. 또한 흔한 실수를 방지하기 위해 시퀀스 패턴은 문자열과도 매치되지 않습니다.
시퀀스 패턴은 와일드카드를 지원합니다:
[x, y, *rest]및(x, y, *rest)는 언패킹 할음에서의 와일드카드와 유사하게 작동합니다.*뒤의 이름도_가 될 수 있으므로,(x, y, *_)은 나머지 항목을 바인딩하지 않으면서 최소 두 개의 항목이 있는 시퀀스를 매칭합니다.매핑 패턴:
{"bandwidth": b, "latency": l}는 딕셔너리에서"bandwidth"와"latency"값을 캡처합니다. 시퀀스 패턴과 달리 추가 키는 무시됩니다. 와일드카드**rest도 지원됩니다. (단,**_는 중복이므로 허용되지 않습니다.)하위 패턴은
as키워드를 사용하여 캡처할 수 있습니다:case (Point(x1, y1), Point(x2, y2) as p2): ...
이것은
as절이 없을 때와 동일하게 x1, y1, x2, y2를 바인딩하며, p2를 대상의 두 번째 항목 전체에 바인딩합니다.대부분의 리터럴은 동등성으로 비교됩니다. 그러나 단일 객체(singleton)인
True,False및None은 동일성으로 비교됩니다.이름이 있는 상수를 패턴에서 사용할 수 있습니다. 이러한 이름이 있는 상수는 상수가 캡처 변수로 해석되는 것을 방지하기 위해 점(.)으로 연결된 이름이어야 합니다:
from enum import Enum class Color(Enum): RED = 0 GREEN = 1 BLUE = 2 color = Color.GREEN match color: case Color.RED: print("I see red!") case Color.GREEN: print("Grass is green") case Color.BLUE: print("I'm feeling the blues :(")
전체 사양은 PEP 634 를 참조하십시오. 동기와 근거는 PEP 635 에 있으며, 더 긴 튜토리얼은 PEP 636 에 있습니다.
선택적 EncodingWarning 및 encoding="locale" 옵션¶
TextIOWrapper 및 open`의 기본 인코딩은 플랫폼과 로케일에 따라 달라집니다. 대부분의 Unix 플랫폼에서 UTF-8이 사용되므로, UTF-8 파일(예: JSON, YAML, TOML, Markdown)을 열 때 ``encoding`() 옵션을 생략하는 것은 매우 흔한 오류입니다. 예를 들면:
\# BUG: "rb" 모드 또는 encoding="utf-8"을 사용해야 합니다.
with open("data.json") as f:
data = json.load(f)
이러한 종류의 오류를 찾기 위해 선택적인 EncodingWarning 이 추가되었습니다. 이 경고는 sys.flags.warn_default_encoding 가 참이고 로케일 전용 기본 인코딩이 사용될 때 발생합니다.
경고를 활성화하기 위해 -X warn_default_encoding 옵션과 PYTHONWARNDEFAULTENCODING 이 추가되었습니다.
더 자세한 정보는 텍스트 인코딩 을 참조하십시오.
이외의 언어 변경 사항¶
int유형에 새로운 메서드int.bit_count()가 추가되어 주어진 정수의 이진 확장에서 1의 개수(population count로도 알려짐)를 반환합니다. (Niklas Fiekas가 bpo-29882 에서 기여함.)dict.keys(),dict.values()및dict.items()에 의해 반환되는 뷰(view)들이 이제 원본 딕셔너리를 래핑하는types.MappingProxyType객체를 제공하는mapping어트리뷰를 가집니다. (Dennis Sweeney가 bpo-40890 에서 기여함.)PEP 618:
zip()함수에 모든 이터러블의 길이가 동일해야 함을 요구하는 선택적strict플래그가 추가되었습니다.정수 인자를 받는 내장 및 확장 함수는 이제
Decimal,Fraction또는 손실이 발생한 상태로만 정수로 변환 가능한 다른 객체(예를 들어,__int__()메서드는 있지만__index__()메서드는 없는 것)를 허용하지 않습니다. (Serhiy Storchaka가 bpo-37999 에서 기여함.)object.__ipow__()이NotImplemented를 반환하는 경우, 연산자는 예상대로object.__pow__()및object.__rpow__()로 올바르게 폴백합니다. (Alex Shkop이 bpo-38302 에서 기여함.)할당 표현식(Assignment expressions)은 이제 집합 리터럴 및 집합 컴프리헨션과 시퀀스 인덱스(슬라이스는 제외) 내에서 괄호 없이 사용될 수 있습니다.
함수는
__builtins__라는 새로운 어트리뷰를 가집니다. 이는 함수 실행 시__globals__['__builtins__']를 참조하는 대신 내장 심볼을 찾는 데 사용됩니다. 이 어트리뷰는 존재할 경우__globals__["__builtins__"]에서, 그렇지 않으면 현재의 builtins에서 초기화됩니다. (Mark Shannon이 bpo-42990 에서 기여함.)각각
iter()및next()에 대응하는 비동기 대안을 제공하기 위해 두 개의 새로운 내장 함수인aiter()와anext()가 추가되었습니다. (Joshua Bronson, Daniel Pope, Justin Wang이 bpo-31861 에서 기여함.)정적 메서드(
@staticmethod) 및 클래스 메서드(@classmethod)는 이제 메서드 어트리뷰스(`__module__,`__name__,`__qualname__,`__doc__,__annotations__)를 상속받고 새로운__wrapped__어트리뷰를 가집니다. 또한, 정적 메서드는 이제 일반 함수처럼 호출할 수 있습니다. (Victor Stinner가 bpo-43682 에서 기여함.)복잡한 대상(
simple name으로 정의된 PEP 526 외의 모든 것)에 대한 어노테이션이from __future__ import annotations와 함께 사용할 때 더 이상 실행 시점에 영향을 미치지 않습니다. (Batuhan Taskaya가 bpo-42737 에서 기여함.)클래스 및 모듈 객체는 이제 요구 사항에 따라 비어있는 어노테이션 딕셔너리를 지연 생성합니다. 이 어노테이션 딕셔너리는 후방 호환성을 위해 객체의
__dict__``에 저장됩니다. 이는 ``__annotations__사용과 관련된 최고의 관행을 개선하며, 더 자세한 내용은 annotations-howto`를 참조하십시오. (Larry Hastings가 :issue:`43901\를 통해 기능을 구현하였습니다.)부작용으로 인해
yield,yield from,await또는 명명된 표현식이from __future__ import annotations아래에서 사용되는 것이 이제 금지됩니다. (Batuhan Taskaya가 bpo-42725 에서 기여함.)어노테이션으로 사용될 때 심볼 테이블 처리를 변경할 수 있는 미결합 변수,
super()및 기타 표현식의 사용이 이제from __future__ import annotations하에서 효과가 없는 것으로 처리됩니다. (Batuhan Taskaya가 bpo-42725 에서 기여함.)float및decimal.Decimal타입의 NaN 값에 대한 해시는 이제 객체 식별성에 의존합니다. 이전에는 NaN 값들이 서로 같지 않음에도 불구하고 항상0으로 해싱되었습니다. 이는 여러 개의 NaN을 포함하는 딕셔너리와 집합을 생성할 때 과도한 해시 충돌로 인해 실행 시간이 기하급수적으로 늘어나는 문제를 일으킬 수 있었습니다. (Raymond Hettinger가 bpo-43475 에서 기여함.)__debug__상수를 삭제할 때NameError대신SyntaxError가 발생합니다. (Donghee Na가 bpo-45000 에서 기여함.)SyntaxError예외에 이제end_lineno및end_offset어트리뷰스가 있습니다. 결정되지 않은 경우None을 반환합니다. (Pablo Galindo가 bpo-43914 에서 기여함.)
새로운 모듈¶
없음.
개선된 모듈¶
asyncio¶
누락된 connect_accepted_socket() 메서드를 추가했습니다. (Alex Grönholm이 bpo-41332 에서 기여함.)
argparse¶
argparse 도움말에서 오해의 소지가 있는 구절 “optional arguments”가 “options”로 교체되었습니다. 정확한 출력 일치에 의존하는 일부 테스트는 수정이 필요할 수 있습니다. (Raymond Hettinger가 bpo-9694 에서 기여함.)
배열(array)¶
array.array 의 index() 메서드에 선택적인 start 및 stop 매개 변수가 추가되었습니다. (Anders Lorentsen과 Zackery Spytz가 bpo-31956 에서 기여함.)
asynchat, asyncore, smtpd¶
이 모듈들은 Python 3.6부터 모듈 문서에서 폐지(deprecated)로 표시되었습니다. 이제 세 모듈 모두에 임포트 시점에 DeprecationWarning 이 추가됩니다.
base64¶
확장된 16진수 알파벳을 포함한 Base32 인코딩을 지원하기 위해 base64.b32hexencode() 와 base64.b32hexdecode() 를 추가했습니다.
bdb¶
설정된 모든 중단점을 재설정하는 clearBreakpoints() 를 추가했습니다. (Irit Katriel이 bpo-24160 에서 기여함.)
bisect¶
bisect 모듈의 API에 key 함수를 제공할 수 있는 기능이 추가되었습니다. (Raymond Hettinger가 bpo-4356 에서 기여함.)
codecs¶
코덱 검색 함수를 등록 해제하는 codecs.unregister() 함수를 추가했습니다. (Hai Shi가 bpo-41842 에서 기여함.)
collections.abc¶
collections.abc.Callable 에 대한 매개 변수가 지정된 제네릭 의 __args__ 가 이제 typing.Callable 과 일치하게 됩니다. collections.abc.Callable 제네릭은 현재 typing.Callable 이 수행하는 것과 유사하게 타입 매개 변수를 평활화합니다. 즉, collections.abc.Callable[[int, str], str] 의 __args__ 가 (int, str, str) 이 됩니다. (이전에는 ([int, str], str) 였습니다.) 이 변경을 수용하기 위해 이제 types.GenericAlias 를 서브클래싱할 수 있으며, collections.abc.Callable 형을 서브스크립트할 때 서브클래스가 반환됩니다. 주의로, Python 3.9에서 허용되었을 수 있는 collections.abc.Callable 의 잘못된 매개 변수화 형식에 대해 TypeError 가 발생할 수 있습니다. (Ken Jin이 bpo-42195 에서 기여함.)
contextlib¶
비동기 제너레이터와 비동기적으로 해제되는 리소스를 나타내는 객체를 안전하게 닫는 contextlib.aclosing() 컨텍스트 관리자를 추가했습니다. (Joongi Kim과 John Belmonte가 bpo-41229 에서 기여함.)
contextlib.nullcontext() 에 비동기 컨텍스트 관리자 지원을 추가했습니다. (Tom Gringauz가 bpo-41543 에서 기여함.)
비동기 컨텍스트 관리자를 데코레이터로 사용하는 것을 지원하기 위해 AsyncContextDecorator 를 추가했습니다.
curses¶
ncurses 6.1에서 추가된 확장 색상 기능이 curses.color_content(), curses.init_color(), curses.init_pair(), 및 curses.pair_content() 에서 투명하게 사용됩니다. 새로운 함수인 curses.has_extended_color_support() 는 기반 ncurses 라이브러리에서 확장 색상 지원을 제공하는지 여부를 나타냅니다. (Jeffrey Kintscher와 Hans Petter Jansson이 bpo-36982 에서 기여함.)
기반 curses 라이브러리에서 제공되는 경우 BUTTON5_* 상수가 이제 curses 모듈에 노출됩니다. (Zackery Spytz가 bpo-39273 에서 기여함.)
dataclasses¶
__slots__¶
@dataclasses.dataclass 데코레이터에 slots 매개 변수를 추가했습니다. (Yurii Karabas가 bpo-42269 에서 기여함.)
키워드 전용 필드¶
dataclasses는 이제 생성된 __init__ 메서드에서 키워드 전용인 필드를 지원합니다. 키워드 전용 필드를 지정하는 방법은 여러 가지가 있습니다.
모든 필드가 키워드 전용임을 명시할 수 있습니다:
from dataclasses import dataclass
@dataclass(kw_only=True)
class Birthday:
name: str
birthday: datetime.date
name``과 ``birthday 모두 생성된 __init__ 메서드의 키워드 전용(keyword-only) 파라미터입니다.
필드별로 키워드 전용 여부를 지정할 수 있습니다:
from dataclasses import dataclass, field
@dataclass
class Birthday:
name: str
birthday: datetime.date = field(kw_only=True)
여기서는 birthday 만 키워드 전용입니다. 개별 필드에 kw_only 를 설정할 경우, 키워드 전용 필드는 반드시 키워드가 아닌 필드 뒤에 위치해야 한다는 규칙으로 인해 필드 순서를 재조정해야 할 수 있음에 유의하십시오. 자세한 내용은 dataclasses 전체 문서를 참조하십시오.
또한 KW_ONLY 표시자 이후의 모든 필드를 키워드 전용으로 지정할 수도 있습니다. 이것이 가장 일반적인 사용 방식일 것입니다:
from dataclasses import dataclass, KW_ONLY
@dataclass
class Point:
x: float
y: float
_: KW_ONLY
z: float = 0.0
t: float = 0.0
여기서 z 와 t 는 키워드 전용 파라미터이고, x 와 y 는 그렇지 않습니다. (Eric V. Smith가 bpo-43532 에서 기여)
distutils¶
distutils 패키지 전체가 폐지되었으며, Python 3.12에서 제거될 예정입니다. 패키지 빌드를 지정하는 기능은 이미 서드파티 패키지인 setuptools 및 packaging 으로 완전히 대체되었으며, 그 외 대부분의 자주 사용되는 API는 표준 라이브러리의 다른 위치(예: platform, shutil, subprocess 또는 sysconfig)에서 사용할 수 있습니다. distutils 의 다른 기능을 이전할 계획은 없으므로, 다른 기능들을 사용하는 애플리케이션은 해당 코드를 사적으로 복사하여 사용할 계획을 세워야 합니다. 자세한 논의는 PEP 632 를 참조하십시오.
Python 3.8에서 폐지된 bdist_wininst 명령이 제거되었습니다. 이제 Windows에서 바이너리 패키지를 배포하려면 bdist_wheel 명령을 사용할 것을 권장합니다. (Victor Stinner가 bpo-42802 에서 기여)
doctest¶
모듈이 __loader__ 를 정의하지 않은 경우, __spec__.loader 를 대신 사용합니다. (Brett Cannon이 bpo-42133 에서 기여)
encodings¶
encodings.normalize_encoding() 이 이제 ASCII가 아닌 문자를 무시합니다. (Hai Shi가 bpo-39337 에서 기여)
enum 관련 요소¶
Enum 의 __repr__() 은 이제 enum_name.member_name 을 반환하며, __str__() 는 member_name 을 반환합니다. 모듈 상수로 제공되는 표준 라이브러리 enum의 repr() 은 module_name.member_name 입니다. (Ethan Furman이 bpo-40066 에서 기여)
모든 멤버가 문자열인 enum을 위한 enum.StrEnum 이 추가되었습니다. (Ethan Furman이 bpo-41816 에서 기여)
fileinput¶
fileinput.input() 및 fileinput.FileInput 에 encoding 및 errors 파라미터가 추가되었습니다. (Inada Naoki가 bpo-43712 에서 기여)
fileinput.hook_compressed() 는 이제 압축되지 않은 파일과 마찬가지로, mode 가 “r”이고 파일이 압축된 경우 TextIOWrapper 객체를 반환합니다. (Inada Naoki가 bpo-5758 에서 기여)
"faulthandler"¶
faulthandler 모듈은 이제 가비지 컬렉터 수집 중에 치명적인 오류가 발생하는지 감지합니다. (Victor Stinner가 bpo-44466 에서 기여)
gc¶
gc.get_objects(), gc.get_referrers(), gc.get_referents() 에 대한 audit hook이 추가되었습니다. (Pablo Galindo가 bpo-43439 에서 기여)
glob¶
glob() 및 iglob() 에 검색을 위한 루트 디렉터리를 지정할 수 있는 root_dir 및 dir_fd 파라미터가 추가되었습니다. (Serhiy Storchaka가 bpo-38144 에서 기여)
hashlib¶
hashlib 모듈은 OpenSSL 1.1.1 이상을 요구합니다. (Christian Heimes가 PEP 644 및 bpo-43669 에서 기여)
hashlib 모듈은 OpenSSL 3.0.0에 대한 예비 지원을 포함합니다. (Christian Heimes가 bpo-38820 및 기타 이슈에서 기여)
pbkdf2_hmac() 의 순수 파이썬(pure-Python) 폴백 기능이 폐지되었습니다. 앞으로 PBKDF2-HMAC은 Python이 OpenSSL 지원과 함께 빌드된 경우에만 사용할 수 있습니다. (Christian Heimes가 bpo-43880 에서 기여)
hmac¶
hmac 모듈은 이제 내부적으로 OpenSSL의 HMAC 구현을 사용합니다. (Christian Heimes가 bpo-40645 에서 기여)
IDLE과 idlelib¶
IDLE이(‘-n’ 없이 시작될 때) sys.excepthook() 을 호출하도록 수정했습니다. 이전에는 사용자 훅이 무시되었습니다. (Ken Hilton이 bpo-43008 에서 기여)
설정 대화 상자를 재배치했습니다. General 탭을 Windows와 Shell/Ed 탭으로 분리했습니다. Help 메뉴를 확장하는 help 소스들을 Extensions 탭으로 이동했습니다. 새로운 옵션을 위한 공간을 확보하고 대화 상자의 길이를 줄였습니다. 이를 통해 작은 화면에서도 대화 상자가 더 잘 맞게 됩니다. (Terry Jan Reedy가 bpo-40468 에서 기여) 들여쓰기 공간(indent space) 설정을 Font 탭에서 새로운 Windows 탭으로 이동했습니다. (Mark Roseman 및 Terry Jan Reedy가 bpo-33962 에서 기여)
위의 변경 사항들이 3.9 유지 보수 버전으로 역 이식되었습니다.
Shell 사이드바를 추가합니다. 기본 프롬프트(‘>>>’)를 사이드바로 옮기고, 보조 프롬프트(’…’)도 사이드바에 추가합니다. 왼쪽 클릭 및 드래그로 텍스트 한 줄 이상을 선택할 수 있으며(편집기 줄 번호 사이드바와 동일), 텍스트를 선택한 후 오른쪽 클릭하면 ‘프롬프트 포함 복사’가 포함된 컨텍스트 메뉴가 나타납니다. 이 옵션은 선택한 텍스트의 컨텍스트 메뉴에도 표시됩니다. (Tal Einat가 bpo-37903 에서 기여)
대화형 코드의 들여쓰기에 탭 대신 공백을 사용합니다. 이를 통해 대화형 코드 항목이 올바르게 보이게 됩니다. 이 기능을 구현하는 것이 Shell 사이드바를 추가한 주요 동기 중 하나였습니다. (Terry Jan Reedy가 bpo-37892 에서 기여)
패턴 매칭 문에서 새로운 소프트 키워드 인 match, case, 그리고 _ 를 강조 표시합니다. 다만 이 하이라이팅은 완벽하지 않으며, case 패턴의 일부 _ 와 같은 드문 경우에 잘못 표시될 수 있습니다. (Tal Einat가 bpo-44010 에서 기여)
3.10 유지 보수 출시 버전의 신규 기능.
.pyi 파일에 구문 강조를 적용했습니다. (Alex Waygood 및 Terry Jan Reedy가 bpo-45447 에서 기여)
입력과 출력이 포함된 Shell을 저장할 때 프롬프트를 포함합니다. (Terry Jan Reedy가 gh-95191 에서 기여)
importlib.metadata¶
importlib_metadata 4.6과 기능적 동등성을 확보했습니다. (역사: <https://importlib-metadata.readthedocs.io/en/latest/history.html>)
importlib.metadata 엔트리 포인트 는 이제 새로운 importlib.metadata.EntryPoints 클래스를 통해 그룹과 이름으로 엔트리 포인트를 선택하는 데 더 편리한 경험을 제공합니다. 폐지 및 사용에 관한 자세한 내용은 문서의 호환성 참고 사항을 확인하십시오.
최상위 Python 모듈 및 패키지를 해당 importlib.metadata.Distribution 으로 확인하기 위한 importlib.metadata.packages_distributions() 가 추가되었습니다.
inspect 메듈¶
모듈이 __loader__ 를 정의하지 않은 경우, __spec__.loader 를 대신 사용합니다. (Brett Cannon이 bpo-42133 에서 기여)
inspect.get_annotations() 이 추가되었으며, 이는 객체에 정의된 어노테이션을 안전하게 계산합니다. 다양한 유형의 객체에서 어노테이션에 접근할 때 발생하는 특이 사항들을 해결하며, 검사하는 객체에 대해 거의 가정을 하지 않습니다. inspect.get_annotations() 는 또한 문자열화된(stringized) 어노테이션을 올바르게 역문자열화할 수 있습니다. 이제 inspect.get_annotations() 은 모든 Python 객체에 정의된 어노테이션 딕셔너리에 접근하기 위한 권장 방식입니다. 어노테이션 작업의 모범 사례에 대한 자세한 내용은 어노테이션 모범 사례 를 참조하십시오. 이와 관련하여, inspect.signature(), inspect.Signature.from_callable(), 그리고 inspect.Signature.from_function() 은 이제 어노테이션을 가져오기 위해 inspect.get_annotations() 를 호출합니다. 이는 inspect.signature() 와 inspect.Signature.from_callable() 도 문자열화된 어노테이션을 역문자열화할 수 있음을 의미합니다. (Larry Hastings가 bpo-43817 에서 기여)
itertools 모듈¶
itertools.pairwise() 가 추가되었습니다. (Raymond Hettinger가 bpo-38200 에서 기여)
linecache¶
모듈이 __loader__ 를 정의하지 않은 경우, __spec__.loader 를 대신 사용합니다. (Brett Cannon이 bpo-42133 에서 기여)
os¶
VxWorks RTOS를 위한 os.cpu_count() 지원이 추가되었습니다. (Peixing Xin이 bpo-41440 에서 기여)
Linux에서 eventfd2 시스템 호출을 래핑하는 새로운 함수 os.eventfd() 및 관련 헬퍼들이 추가되었습니다. (Christian Heimes가 bpo-41001 에서 기여)
커널 주소 공간과 사용자 주소 공간 간에 데이터를 복사하지 않고 두 개의 파일 디스크립터 간에 데이터를 이동할 수 있는 os.splice() 가 추가되었습니다(단, 파일 디스크립터 중 하나는 파이프를 가리켜야 합니다). (Pablo Galindo가 bpo-41625 에서 기여)
macOS를 위해 O_EVTONLY, O_FSYNC, O_SYMLINK, 그리고 O_NOFOLLOW_ANY 가 추가되었습니다. (Donghee Na가 bpo-43106 에서 기여)
os.path¶
os.path.realpath() 이 이제 strict 키워드 전용 인자를 수락합니다. 이 값을 True 로 설정하면 경로가 존재하지 않거나 심볼릭 링크 루프가 발견될 경우 OSError 가 발생합니다. (Barney Gale이 bpo-43757 에서 기여)
pathlib¶
PurePath.parents 에 슬라이스 지원이 추가되었습니다. (Joshua Cannon이 bpo-35498 에서 기여)
PurePath.parents 에 음수 인덱싱 지원이 추가되었습니다. (Yaroslav Pankovych가 bpo-21041 에서 기여)
link_to() 를 대체하는 Path.hardlink_to 메서드가 추가되었습니다. 새 메서드는 symlink_to() 와 동일한 인자 순서를 가집니다. (Barney Gale이 bpo-39950 에서 기여)
pathlib.Path.stat() 및 chmod() 가 os 모듈의 관련 함수들과 일관성을 유지하기 위해 follow_symlinks 키워드 전용 인자를 수락하도록 변경되었습니다. (Barney Gale이 bpo-39906 에서 기여)
플랫폼¶
freedesktop.org os-release <https://www.freedesktop.org/software/systemd/man/os-release.html> 표준 파일에서 운영체제 식별 정보를 가져오는 platform.freedesktop_os_release() 가 추가되었습니다. (Christian Heimes가 bpo-28468 에서 기여)
pprint¶
pprint.pprint() 가 새로운 underscore_number 키워드 인자를 수락합니다. (sblondon이 bpo-42914 에서 기여)
pprint 에서 이제 dataclasses.dataclass 인스턴스를 예쁘게 출력할 수 있습니다. (Lewis Gaul이 bpo-43080 에서 기여)
py_compile¶
py_compile 의 명령줄 인터페이스에 --quiet 옵션이 추가되었습니다. (Gregory Schevchenko가 bpo-38731 에서 기여)
pyclbr¶
pyclbr.readmodule() 및 pyclbr.readmodule_ex() 가 반환하는 트리 내의 Function 및 Class 객체에 end_lineno 속성이 추가되었습니다. 이는 기존(시작) lineno 와 일치합니다. (Aviral Srivastava가 bpo-38307 에서 기여)
shelve¶
shelve 모듈은 이제 쉘프를 생성할 때 pickle 프로토콜 3 대신 기본값인 pickle.DEFAULT_PROTOCOL 을 사용합니다. (Zackery Spytz가 bpo-34204 에서 기여)
statistics¶
covariance(), 피어슨의 correlation(), 그리고 단순한 linear_regression() 함수를 추가했습니다. (Tymoteusz Wołodźko가 bpo-38490 에서 기여).
site¶
모듈이 __loader__ 를 정의하지 않은 경우, __spec__.loader 를 대신 사용합니다. (Brett Cannon이 bpo-42133 에서 기여)
소켓 모듈¶
예외 socket.timeout 이 이제 TimeoutError 의 별칭입니다. (Christian Heimes가 bpo-42413 에서 기여).
IPPROTO_MPTCP 를 사용하여 MPTCP 소켓을 생성하는 옵션을 추가했습니다. (Rui Cunha가 bpo-43571 에서 기여).
서비스 유형(ToS) 또는 DSCP/ECN 필드를 수신하기 위한 IP_RECVTOS 옵션을 추가했습니다. (Georg Sauthoff가 bpo-44077 에서 기여).
ssl¶
ssl 모듈은 OpenSSL 1.1.1 이상이 필요합니다. (Christian Heimes가 PEP 644 및 bpo-43669 에서 기여).
ssl 모듈이 OpenSSL 3.0.0과 새로운 옵션인 OP_IGNORE_UNEXPECTED_EOF 를 예비적으로 지원합니다. (Christian Heimes가 bpo-38820, bpo-43794, bpo-43788, bpo-43791, bpo-43799, bpo-43920, bpo-43789, 및 bpo-43811 에서 기여).
폐지된 함수 및 폐지된 상수의 사용이 이제 DeprecationWarning 을 발생시킵니다. ssl.SSLContext.options 은 기본적으로 OP_NO_SSLv2 및 OP_NO_SSLv3 가 설정되어 있어, 해당 플래그를 다시 설정하는 것에 대해 경고할 수 없습니다. deprecation section 에서 폐지된 기능 목록을 확인할 수 있습니다. (Christian Heimes가 bpo-43880 에서 기여).
ssl 모듈이 이제 더욱 안전한 기본 설정을 제공합니다. 전방향 보안(forward secrecy)이나 SHA-1 MAC이 없는 암호는 기본적으로 비활성화됩니다. 보안 수준 2에서는 112비트 미만의 보안성을 가진 약한 RSA, DH 및 ECC 키를 금지합니다. SSLContext 는 최소 프로토콜 버전으로 TLS 1.2를 기본값으로 사용합니다. 설정은 Hynek Schlawack의 연구 결과를 바탕으로 합니다. (Christian Heimes가 bpo-43998 에서 기여).
폐지된 프로토콜인 SSL 3.0, TLS 1.0 및 TLS 1.1은 더 이상 공식적으로 지원되지 않습니다. 파이썬이 이를 능동적으로 차단하지는 않으나, OpenSSL 빌드 옵션, 배포 설정, 공급업체 패치 및 암호 세트에 의해 핸드셰이크가 실패할 수 있습니다.
ssl.get_server_certificate() 함수에 timeout 매개 변수를 추가했습니다. (Zackery Spytz가 bpo-31870 에서 기여).
ssl 모듈이 heap-type과 다단계 초기화를 사용합니다. (Christian Heimes가 bpo-42333 에서 기여).
새로운 확인 플래그인 VERIFY_X509_PARTIAL_CHAIN 이 추가되었습니다. (l0x가 bpo-40849 에서 기여).
sqlite3 모듈¶
connect(), enable_load_extension(), 그리고 load_extension() 에 대한 감사 이벤트를 추가했습니다. (Erlend E. Aasland가 bpo-43762 에서 기여).
sys 모듈¶
sys.orig_argv 속성을 추가했습니다. 이는 파이썬 실행 파일에 전달된 원래의 명령 줄 인자 목록입니다. (Victor Stinner가 bpo-23427 에서 기여).
표준 라이브러리 모듈 이름 목록을 포함하는 sys.stdlib_module_names 를 추가했습니다. (Victor Stinner가 bpo-42955 에서 기여).
_thread¶
_thread.interrupt_main() 이 이제 시뮬레이션할 선택적 신호 번호를 인자로 받습니다(기본값은 여전히 signal.SIGINT 입니다). (Antoine Pitrou가 bpo-43356 에서 기여).
threading¶
threading.settrace() 및 threading.setprofile() 에 의해 설정된 함수를 각각 가져오는 threading.gettrace() 와 threading.getprofile() 을 추가했습니다. (Mario Corchero가 bpo-42251 에서 기여).
threading.excepthook() 이 손상되었거나 다른 값으로 설정된 경우에도 원래 값을 가져올 수 있도록 threading.__excepthook__ 를 추가했습니다. (Mario Corero가 bpo-42308 에서 기여).
추적(Traceback)¶
format_exception(), format_exception_only(), 그리고 print_exception() 함수가 이제 예외 객체를 위치 전용 인자로 받을 수 있습니다. (Zackery Spytz 및 Matthias Bussonnier가 bpo-26389 에서 기여).
types¶
타입 체크가 쉽게 해석할 수 있는 새로운 형 세트를 제공하기 위해 types.EllipsisType, types.NoneType, 그리고 types.NotImplementedType 클래스를 다시 도입했습니다. (Bas van Beek이 bpo-41810 에서 기여).
타이핑¶
주요 변경 사항은 형 힌트와 관련된 새로운 기능 를 참조하십시오.
typing.Literal 의 동작이 PEP 586 를 준수하고 해당 PEP에 명시된 정적 타입 체크 도구의 동작과 일치하도록 변경되었습니다.
Literal이 이제 매개변제의 중복을 제거합니다.Literal객체 간의 동등 비교가 이제 순서에 무관하게 수행됩니다.Literal비교가 이제 형을 준수합니다. 예를 들어,Literal[0] == Literal[False]는 이전에는True로 평가되었으나, 이제False입니다. 이 변경을 지원하기 위해 내부적으로 사용되는 형 캐시가 이제 형 구분을 지원합니다.Literal객체는 이제 매개변수 중 하나라도 해시 가능\하지 않으면 동등 비교 중에TypeError예외를 발생시킵니다. 가변 매개 변수로Literal\을 선언하는 것은 에러가 발생하지 않음에 유의하십시오:>>> 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'
(Yurii Karabas가 bpo-42345 에서 기여).
어떤 주석이 typing.TypedDict 인지 내성(introspection)하는 새로운 기능인 typing.is_typeddict() 를 추가했습니다. (Patrick Reader가 bpo-41792 에서 기여).
데이터 변수만 선언된 typing.Protocol 의 하위 클래스가 @~typing.runtime_checkable 로 데코레이션되지 않은 경우, isinstance 로 확인 시 이제 TypeError 를 발생시킵니다. 이전에는 이러한 확인이 아무런 문제 없이 통과되었습니다. 실행 시점 프로토콜을 원할 경우 사용자는 하위 클래스에 @runtime_checkable 데코레이터를 적용해야 합니다. (Yurii Karabas가 bpo-38908 에서 기여).
typing.io 및 typing.re 서브모듈에서 임포트할 경우 이제 DeprecationWarning 이 발생합니다. 이 서브모듈들은 파이썬 3.8부터 폐지되었으며 향후 파이썬 버전에서 제거될 예정입니다. 해당 서브모듈에 속한 항목은 대신 typing 에서 직접 임포트해야 합니다. (Sebastian Rittau가 bpo-38291 에서 기여).
unittest`¶
기존의 assertLogs() 를 보완하기 위해 새로운 메서드인 assertNoLogs() 를 추가했습니다. (Kit Yan Choi가 bpo-39385 에서 기여).
urllib.parse¶
파이썬 3.10 이전 버전에서는 urllib.parse.parse_qs() 및 urllib.parse.parse_qsl() 에서 쿼리 매개 변수 구분자로 & 와 ; 를 모두 사용할 수 있었습니다. 보안 문제로 인해, 그리고 최신 W3C 권장 사항을 준수하기 위해, 이를 단일 구분자 키만 허용하며 & 를 기본값으로 사용하도록 변경되었습니다. 이 변경은 해당 함수들을 내부적으로 사용하는 cgi.parse() 및 cgi.parse_multipart() 에도 영향을 미칩니다. 자세한 내용은 각 관련 문서를 참조하십시오. (Adam Goldschmidt, Senthil Kumaran, Ken Jin이 bpo-42967 에서 기여).
URL의 일부에 줄 바꿈이나 탭 문자가 포함되면 다양한 형태의 공격이 가능해집니다. RFC 3986 을 업데이트하는 WHATWG 사양을 따라, urllib.parse 파서가 URL에서 ASCII 줄 바꿈 \n, \r 및 탭 \t 문자를 제거하여 이러한 공격을 방지합니다. 제거되는 문자들은 새로운 모듈 수준 변수인 urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE 에 의해 제어됩니다. (gh-88048 참조)
xml¶
xml.sax.handler 모듈에 LexicalHandler 클래스를 추가했습니다. (Jonathan Gossage 및 Zackery Spytz가 bpo-35018 에서 기여).
zipimport¶
PEP 451 과 관련된 메서드인 find_spec(), zipimport.zipimporter.create_module(), 그리고 zipimport.zipimporter.exec_module() 을 추가했습니다. (Brett Cannon이 bpo-42131 에서 기여).
invalidate_caches() 메서드를 추가했습니다. (Desmond Cheong이 bpo-14678 에서 기여).
최적화들`¶
str(),bytes(), 및bytearray()생성자가 더 빨라졌습니다(작은 객체의 경우 약 30~40%). (Serhiy Storchaka가 bpo-41334 에서 기여).runpy모듈이 이제 더 적은 수의 모듈을 임포트합니다.python3 -m module-name명령 실행 시 평균 1.4배 빠른 시작 시간을 제공합니다. Linux에서python3 -I -m module-name은 Python 3.9에서 69개의 모듈을 임포트하는 반면, Python 3.10에서는 51개(18개 감소)의 모듈만 임포트합니다. (Victor Stinner가 bpo-41006 및 bpo-41718 에서 기여).LOAD_ATTR명령이 이제 새로운 “opcode 단위 캐시” 메커니즘을 사용합니다. 일반 속성의 경우 약 36%, slot의 경우 약 44% 더 빨라졌습니다. (Pablo Galindo 및 Yury Selivanov가 bpo-42093 에서, Guido van Rossum이 bpo-42927 에서 기여. 이는 PyPy와 MicroPython에서 처음 구현된 아이디어를 기반으로 합니다.)Python을
--enable-optimizations옵션과 함께 빌드할 때, 이제 컴파일 및 링크 단계 모두에-fno-semantic-interposition이 추가됩니다. 이로 인해gcc를 사용하여--enable-shared와 함께 생성된 Python 인터프리터의 빌드 속도가 최대 30% 향상됩니다. 자세한 내용은 이 기사 를 참조하십시오. (Victor Stinner와 Pablo Galindo가 bpo-38980 에서 기여함.)bz2/lzma/zlib모듈에 새로운 출력 버퍼 관리 코드를 사용하며,_compression.DecompressReader클래스에.readall()함수를 추가합니다. 이로 인해 bz2 압축 해제는 1.09배 ~ 1.17배, lzma 압축 해제는 1.20배 ~ 1.32배,GzipFile.read(-1)은 1.11배 ~ 1.18배 더 빨라집니다. (Ma Lin이 기여하고 Gregory P. Smith가 bpo-41486 에서 검토함.)문자열화된 어노테이션을 사용하는 경우, 함수가 생성될 때 더 이상 해당 함수의 어노테이션 딕셔너리가 생성되지 않습니다. 대신 문자열 튜플로 저장되며, 함수 객체가 필요할 때 이 튜플을 어노테이션 딕셔너리로 지연 변환합니다. 이 최적화로 인해 어노테이션이 포함된 함수를 정의하는 데 필요한 CPU 시간이 절반으로 줄어듭니다. (Yurii Karabas와 Inada Naoki가 bpo-42202 에서 기여함.)
str1 in str2및str2.find(str1)과 같은 하위 문자열 검색 함수가 이제 긴 문자열에서 2차 함수 형태의 동작을 방지하기 위해 때때로 Crochemore & Perrin의 “Two-Way” 문자열 검색 알고리즘을 사용합니다. (Dennis Sweeney가 bpo-41972 에서 기여함.)캐시 히트가 빈번한 일반적인 경우에 타입 속성 캐시 조회의 성능을 개선하기 위해
_PyType_Lookup()에 마이크로 최적화를 추가했습니다. 이로 인해 인터프리터가 평균 1.04배 빨라졌습니다. (Dino Viehland가 bpo-43452 에서 기여함.)다음의 내장 함수들이 더 빠른 PEP 590 vectorcall 호출 규약을 지원하게 됩니다:
map(),filter(),reversed(),bool(), 그리고float(). (Donghee Na와 Jeroen Demeyer가 bpo-43575, bpo-43287, bpo-41922, bpo-41873, bpo-41870 에서 기여함.)내부
RLock을 제거하여BZ2File의 성능을 향상시켰습니다. 이로 인해BZ2File은 여러 독자 또는 작성자가 동시에 존재하는 경우 스레드 안전하지 않게 되며, 이는 그와 동일한 역할을 하는gzip및lzma모듈의 클래스들과 항상 동일했던 동작입니다. (Inada Naoki가 bpo-43785 에서 기여함.)
폐지됨¶
현재 Python은 숫자 리터럴 바로 뒤에 키워드가 오는 것을 허용합니다. 예를 들어
0in x,1or x,0if 1else 2등이 허용됩니다. 이로 인해[0x1for x in y](는[0x1 for x in y]또는[0x1f or x in y]로 해석될 수 있음)와 같이 혼란스럽고 모호한 표현이 가능합니다. 이번 릴리스부터 숫자 리터럴 바로 뒤에and,else,for,if,in,is,or키워드 중 하나가 오는 경우 더하기 경고(deprecation warning)를 발생시킵니다. 향후 릴리스에서는 구문 경고(syntax warning)로, 최종적으로는 구문 오류(syntax error)로 변경될 예정입니다. (Serhiy Storchaka가 bpo-43833 에서 기여함.)이번 릴리스부터 Python 2.7 호환성을 위해 유지해 온 오래된 임포트 문법을 정리하기 위한 노력이 시작됩니다. 구체적으로,
find_loader()/find_module()(find_spec()으로 대체됨),importlib.abc.Loader.load_module(exec_module()으로 대체됨),module_repr()(임포트 시스템에서 처리함),__package__속성(__spec__.parent로 대체됨),`__loader__속성(__spec__.loader로 대체됨), 그리고__cached__속성(__spec__.cached로 대체됨)이 점진적으로 제거될 예정입니다(그 외importlib내의 다른 클래스 및 메서드들도 포함). 이 전환 과정에서 업데이트가 필요한 코드를 식별할 수 있도록 적절한 경우에 따라ImportWarning또는DeprecationWarning을 발생시킵니다.distutils네임스페이스 전체가 더 이상 권장되지 않으며(deprecated), Python 3.12에서 제거될 예정입니다. 자세한 내용은 모듈 변경 사항 섹션을 참조하십시오.random.randrange()에 정수가 아닌 인자를 전달하는 것이 더 이상 권장되지 않습니다. 또한 기존의ValueError대신TypeError가 발생합니다. (Serhiy Storchaka와 Raymond Hettinger가 bpo-37319 에서 기여함.)importlib의 다양한load_module()메서드들은 Python 3.6부터 사용 중단이 문서화되었으나, 이제는 실제DeprecationWarning을 발생시킵니다. 대신exec_module()을 사용하십시오. (Brett Cannon이 bpo-26131 에서 기여함.)zimport.zipimporter.load_module()은 이제exec_module()을 대신 사용하는 것을 권장하며, 해당 메서드는 더 이상 사용되지 않습니다(deprecated). (Brett Cannon이 bpo-26131 에서 기여함.)임포트 시스템에서
importlib.abc.Loader.load_module을 사용하는 경우, 더 권장되는 메서드인exec_module()을 사용하도록 안내하는ImportWarning이 발생합니다. (Brett Cannon이 bpo-26131 에서 기여함.)임포트 시스템에서
importlib.abc.MetaPathFinder.find_module()및importlib.abc.PathEntryFinder.find_module()를 사용하는 경우, 각각 권장되는 메서드인importlib.abc.MetaPathFinder.find_spec()과importlib.abc.PathEntryFinder.find_spec()을 사용하도록 안내하는ImportWarning이 발생합니다. 이식 작업을 돕기 위해importlib.util.spec_from_loader()를 사용할 수 있습니다. (Brett Cannon이 bpo-42134 에서 기여함.)임포트 시스템에서
importlib.abc.PathEntryFinder.find_loader()를 사용하는 경우, 권장되는 메서드인importlib.abc.PathEntryFinder.find_spec()을 사용하도록 안내하는ImportWarning이 발생합니다. 이식 작업을 돕기 위해importlib.util.spec_from_loader()를 사용할 수 있습니다. (Brett Cannon이 bpo-43672 에서 기여함.)importlib.abc.MetaPathFinder.find_module()의 다양한 구현체(importlib.machinery.BuiltinImporter.find_module(),importlib.machinery.FrozenImporter.find_module(),importlib.machinery.WindowsRegistryFinder.find_module(),importlib.machinery.PathFinder.find_module(),importlib.abc.MetaPathFinder.find_module()),importlib.abc.PathEntryFinder.find_module()(importlib.machinery.FileFinder.find_module()), 및importlib.abc.PathEntryFinder.find_loader()(importlib.machinery.FileFinder.find_loader())는 이제DeprecationWarning을 발생시키며 Python 3.12에서 제거될 예정입니다(이전에는 Python 3.4에서 사용 중단으로 기록되었습니다). (Brett Cannon이 bpo-42135 에서 기여함.)importlib.abc.Finder는 사용 중단되었으며(유일한 메서드인find_module()포함),importlib.abc.MetaPathFinder와importlib.abc.PathEntryFinder모두 더 이상 이 클래스를 상속받지 않습니다. 사용자는 상황에 따라 이 두 클래스 중 하나를 상속받아야 합니다. (Brett Cannon이 bpo-42135 에서 기여함.)imp,importlib.find_loader(),importlib.util.set_package_wrapper(),importlib.util.set_loader_wrapper(),importlib.util.module_for_loader(),pkgutil.ImpImporter, 및pkgutil.ImpLoader의 사용 중단(deprecation)에 대해 모든 대상 제거 버전이 Python 3.12로 업데이트되었습니다(이들은 이전 Python 버전에서 이미DeprecationWarning을 발생시키기 시작했습니다). (Brett Cannon이 bpo-43720 에서 기여함.)임포트 시스템은 이제 모듈의
__repr__()메서드를 위해module_repr()으로 대체하기 전에 모듈의__spec__속성을 먼저 사용합니다.module_repr()의 사용을 중단하는 것은 Python 3.12에 예정되어 있습니다. (Brett Cannon이 bpo-42137 에서 기여함.)importlib.abc.Loader.module_repr(),importlib.machinery.FrozenLoader.module_repr(), 및importlib.machinery.BuiltinLoader.module_repr()은 사용 중단되었으며 Python 3.12에서 제거될 예정입니다. (Brett Cannon이 bpo-42136 에서 기여함.)sqlite3.OptimizedUnicode은 Python 3.3에서str의 별칭으로 지정된 이후로 문서화되지 않았으며 더 이상 사용되지 않습니다. 이제 해당 항목은 중단되었으며(deprecated) Python 3.12에 제거될 예정입니다. (Erlend E. Aasland가 bpo-42264 에서 기여함.)문서화되지 않은 내장 함수
sqlite3.enable_shared_cache는 이제 사용 중단되었으며 Python 3.12에 제거될 예정입니다. SQLite3 문서는 이 함수의 사용을 강력히 권고하지 않습니다. 자세한 내용은 SQLite3 문서 를 참조하십시오. 공유 캐시가 반드시 필요한 경우,cache=shared쿼리 파라미터를 사용하여 URI 모드로 데이터베이스를 여십시오. (Erlend E. Aasland가 bpo-24464 에서 기여함.)다음의
threading메서드들이 사용 중단(deprecated)되었습니다:threading.currentThread=>threading.current_thread()threading.activeCount=>threading.active_count()threading.Condition.notifyAll=>threading.Condition.notify_all()threading.Event.isSet=>threading.Event.is_set()threading.Thread.setName=>threading.Thread.namethreading.thread.getName=>threading.Thread.namethreading.Thread.isDaemon=>threading.Thread.daemonthreading.Thread.setDaemon=>threading.Thread.daemon
(Jelle Zijlstra가 gh-87889 에서 기여함.)
pathlib.Path.link_to()는 사용 중단되었으며 Python 3.12에 제거될 예정입니다. 대신pathlib.Path.hardlink_to()를 사용하십시오. (Barney Gale가 bpo-39950 에서 기여함.)cgi.log()는 사용 중단되었으며 Python 3.12에 제거될 예정입니다. (Inada Naoki가 bpo-41139 에서 기여함.)다음의
ssl기능들은 Python 3.6, Python 3.7 또는 OpenSSL 1.1.0부터 사용 중단되었으며 3.11에서 제거됩니다:OP_NO_SSLv2,OP_NO_SSLv3,OP_NO_TLSv1,OP_NO_TLSv1_1,OP_NO_TLSv1_2, 및OP_NO_TLSv1_3은 이제minimum_version과maximum_version으로 대체됩니다.PROTOCOL_SSLv2,PROTOCOL_SSLv3,PROTOCOL_SSLv23,PROTOCOL_TLSv1,PROTOCOL_TLSv1_1,PROTOCOL_TLSv1_2, 그리고PROTOCOL_TLS는 더 권장되는 것인PROTOCOL_TLS_CLIENT및PROTOCOL_TLS_SERVER를 위해 사용 중단되었습니다.wrap_socket()는ssl.SSLContext.wrap_socket()으로 대체됩니다.match_hostname()RAND_pseudo_bytes(),RAND_egd()ssl.SSLSocket.selected_npn_protocol()및ssl.SSLContext.set_npn_protocols()와 같은 NPN 기능들은 ALPN으로 대체됩니다.
스레딩 디버그(
PYTHONTHREADDEBUG환경 변수)는 Python 3.10에서 사용 중단되었으며 Python 3.12에 제거될 예정입니다. 이 기능은 Python의 디버그 빌드 가 필요합니다. (Victor Stinner가 bpo-44584 에서 기여함.)typing.io및typing.re서브모듈에서 임포트하면 이제DeprecationWarning이 발생합니다. 이 서브모듈들은 향후 파이썬 버전에서 제거될 예정입니다. 해당 서브모듈에 속한 모든 내용은 대신typing에서 직접 임포트해야 합니다. (Sebastian Rittau가 bpo-38291 을 통해 기여함.)
제거됨¶
complex클래스의 특수 메서드인__int__,__float__,__floordiv__,__mod__,__divmod__,__rfloordiv__,__rmod__및__rdivmod__를 제거했습니다. 이 메서드들은 항상TypeError를 발생시켰습니다. (Serhiy Storchaka가 bpo-41974 를 통해 기여함.)비공개 및 미문서화된
_markupbase모듈의ParserBase.error()메서드가 제거되었습니다.html.parser.HTMLParser는ParserBase의 유일한 서브클래스이며, 해당 클래스의error()구현은 파이썬 3.5에서 이미 제거되었습니다. (Berker Peksag가 bpo-31844 를 통해 기여함.)내부 PyCapsule 객체였던
unicodedata.ucnhash_CAPI속성을 제거했습니다. 관련된 비공개_PyUnicode_Name_CAPI구조는 내부 C API로 이동되었습니다. (Victor Stinner가 bpo-42157 을 통해 기여함.)새로운 PEG 파서로 전환됨에 따라 3.9에서 폐지된
parser모듈과 기존 파서에서만 사용되던 모든 C 소스 및 헤더 파일(node.h,parser.h,graminit.h,grammar.h포함)을 제거했습니다.새로운 PEG 파서로 전환됨에 따라 3.9에서 폐지된 공개 C API 함수
PyParser_SimpleParseStringFlags,PyParser_SimpleParseStringFlagsFilename,PyParser_SimpleParseFileFlags및PyNode_Compile을 제거했습니다.파이썬 3.4에서 폐지된
formatter모듈을 제거했습니다. 이 모듈은 다소 오래되었고, 거의 사용되지 않으며 테스트도 되지 않았습니다. 원래 파이썬 3.6에서 제거될 예정이었으나 파이썬 2.7 EOL 이후로 연기되었습니다. 기존 사용자는 현재 사용 중인 클래스를 자신의 코드에 직접 복사하여 사용해야 합니다. (Donghee Na와 Terry J. Reedy가 bpo-42299 를 통해 기여함.)이제
_warnings모듈이 2.6에서 내장 모듈로 변환되면서 쓸모없게 된PyModule_GetWarningsModule()함수가 제거되었습니다. (Contributed by Hai Shi in bpo-42599.)collections모듈에서 폐지된 Collections 추상 베이스 클래스 별칭을 제거했습니다. (Victor Stinner가 bpo-37324 를 통해 기여함.)파이썬 3.8에서 폐지됨에 따라, 대부분의
asyncio표준 문서인 high-level API <../library/asyncio-api-index>`에서 ``loop` 매개변수를 제거했습니다. 이러한 변경의 이유는 다음과 같습니다.이것은 고수준(high-level) API를 단순화합니다.
파이썬 3.7부터 고수준 API의 함수들이 현재 실행 중인 스레드의 이벤트 루프를 암시적으로 가져옵니다. 대부분의 일반적인 사용 사례에서는 API에 이벤트 루프를 전달할 필요가 없습니다.
이벤트 루프를 전달하는 방식은 특히 서로 다른 스레드에서 실행되는 루프를 다룰 때 오류가 발생하기 쉽습니다.
저수준(low-level) API는 여전히
loop를 수락한다는 점에 유의하십시오. 기존 코드를 대체하는 방법의 예시는 파이썬 API 변경 사항 를 참조하십시오.(Yurii Karabas, Andrew Svetlov, Yury Selivanov 및 Kyle Stanley가 bpo-42392 를 통해 기여함.)
파이썬 3.10로 이식¶
이 섹션은 이전에 설명된 변경 사항과 코드를 수정해야 할 수도 있는 기타 버그 수정을 나열합니다.
파이썬 구문 변경 사항¶
숫자 리터럴이 키워드(예:
0in x) 바로 뒤에 오는 경우, 이제 숫자 리터럴과 후속 키워드 사이에 공백을 추가하면 경고를 제거하고 미래 릴리스와 호환되도록 할 수 있습니다. 이전에는 Deprecation warning으로 emit되었으나, 향후 릴리스에서는 syntax warning으로 변경되고 최종적으로는 syntax error가 됩니다. (Contributed by Serhiy Storchaka in bpo-43833.)
파이썬 API 변경 사항¶
The etype parameters of the
format_exception(),format_exception_only(), andprint_exception()functions in thetracebackmodule have been renamed to exc. (Contributed by Zackery Spytz and Matthias Bussonnier in bpo-26389.)atexit: 파이썬 종료 시atexit.register()로 등록된 콜백이 실패하면 이제 해당 예외가 기록됩니다. 이전에는 일부 예외만 기록되었으며 마지막 예외는 항상 무시되었습니다. (Victor Stinner가 bpo-42639 를 통해 기여함.)collections.abc.Callable제네릭은 이제typing.Callable이 현재 수행하는 것과 유사하게 형식 매개변수를 평탄화(flatten)합니다. 즉,collections.abc.Callable[[int, str], str]의__args__가(int, str, str)이 됩니다. 이전에는([int, str], str)이었습니다.typing.get_args()나__args__를 통해 인자에 접근하는 코드는 이 변경 사항을 반영해야 합니다. 또한 파이썬 3.9에서 무시되었을 수 있는collections.abc.Callable의 유효하지 않은 매개변수화 형식에 대해TypeError가 발생할 수 있습니다. (Ken Jin이 bpo-42195 를 통해 기여함.)socket.htons()및socket.ntohs()는 주어진 매개변수가 16비트 부호 없는 정수에 들어가지 않는 경우, 이제DeprecationWarning대신OverflowError를 발생시킵니다. (Erlend E. Aasland가 bpo-42393 을 통해 기여함.)파이썬 3.8에서 폐지됨에 따라, 대부분의
asyncio표준 문서인 high-level API <../library/asyncio-api-index>`에서 ``loop` 매개변수를 제거했습니다.현재 다음과 같이 보이는 코루틴:
async def foo(loop): await asyncio.sleep(1, loop=loop)
다음과 같이 대체되어야 합니다:
async def foo(): await asyncio.sleep(1)
만약
foo()가 현재 스레드에서 실행 중인 이벤트 루프에서 실행되지 않도록 특별히 설계된 경우(예: 다른 스레드의 이벤트 루프에서 실행되는 경우), 대신asyncio.run_coroutine_threadsafe()를 사용하는 것을 고려하십시오.(Yurii Karabas, Andrew Svetlov, Yury Selivanov 및 Kyle Stanley가 bpo-42392 를 통해 기여함.)
types.FunctionType생성자는 이제 globals 딕셔너리에"__builtins__"키가 없는 경우,{"None": None}을 내장 함수로 사용하는 대신 현재의 내장 함수들을 상속합니다. 이는eval()및exec()함수와 동일한 동작입니다. 파이썬에서def function(...): ...구문으로 함수를 정의하는 경우는 영향을 받지 않으며, 이 구문을 사용하여 globals를 덮어쓸 수 없습니다(마찬가지로 현재의 내장 함수들을 상속하기 때문입니다). (Victor Stinner가 bpo-42990 을 통해 기여함.)
C API 변경 사항¶
새로운 PEG 파서로 전환됨에 따라 C API 함수
PyParser_SimpleParseStringFlags,PyParser_SimpleParseStringFlagsFilename,PyParser_SimpleParseFileFlags,PyNode_Compile및 이들 함수에서 사용되는 타입인struct _node가 제거되었습니다.이제 소스는 예를 들어
Py_CompileString()을 사용하여 직접 코드 객체로 컴파일해야 합니다. 생성된 코드 객체는 그 후 예컨대PyEval_EvalCode()를 사용하여 평가할 수 있습니다.구체적으로:
PyParser_SimpleParseStringFlags호출 후 이어지는PyNode_Compile은Py_CompileString()을 호출하는 것으로 대체할 수 있습니다.PyParser_SimpleParseFileFlags에 대한 직접적인 대체제가 없습니다.FILE *인자로부터 코드를 컴파일하려면 C에서 파일을 읽고 결과 버퍼를Py_CompileString()에 전달해야 합니다.char *파일 이름을 가진 파일을 컴파일하려면, 명시적으로 파일을 열고 읽은 다음 결과를 컴파일하십시오. 이를 수행하는 한 가지 방법은 아래 예시와 같이PyImport_ImportModule(),PyObject_CallMethod(),PyBytes_AsString()및Py_CompileString()과 함께io모듈을 사용하는 것입니다. (선언 및 에러 처리는 생략됨.)io_module = Import_ImportModule("io"); fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb"); source_bytes_object = PyObject_CallMethod(fileobject, "read", ""); result = PyObject_CallMethod(fileobject, "close", ""); source_buf = PyBytes_AsString(source_bytes_object); code = Py_CompileString(source_buf, filename, Py_file_input);
FrameObject객체의 경우,f_lasti멤버는 이제 바이트코드 문자열 내의 단순 오프셋이 아니라 워드코드(wordcode) 오프셋을 나타냅니다. 이는 이 숫자가 바이트 오프셋을 기대하는 API(예:PyCode_Addr2Line())에서 사용될 때 2를 곱해야 함을 의미합니다. 또한FrameObject객체의f_lasti멤버는 안정적이지 않은 것으로 간주되므로 대신PyFrame_GetLineNumber()를 사용하십시오.
CPython 바이트코드 변경 사항¶
MAKE_FUNCTION명령은 이제 함수의 어노테이션으로 딕셔너리 또는 문자열의 튜플을 허용합니다. (Yurii Karabas와 Inada Naoki가 bpo-42202 를 통해 기여함.)
빌드 변경 사항¶
PEP 644: 파이썬은 이제 OpenSSL 1.1.1 이상 버전을 요구합니다. OpenSSL 1.0.2는 더 이상 지원되지 않습니다. (Christian Heimes가 bpo-43669 를 통해 기여함.)
파이썬을 빌드하려면 이제 C99 함수인
snprintf()및vsnprintf()가 필요합니다. (Victor Stinner가 bpo-36020 을 통해 기여함.)sqlite3는 SQLite 3.7.15 이상 버전을 요구합니다. (Sergey Fedoseev와 Erlend E. Aasland가 bpo-40744 및 bpo-40810 을 통해 기여함.)atexit모듈은 이제 항상 내장(built-in) 모듈로 빌드되어야 합니다. (Victor Stinner가 bpo-42639 를 통해 기여함.)configure스크립트에 테스트 모듈을 빌드하거나 설치하지 않는--disable-test-modules옵션을 추가했습니다. (Xavier de Gaye, Thomas Petazzoni 및 Peixing Xin이 bpo-27640 을 통해 기여함.)./configure스크립트에--with-wheel-pkg-dir=PATH option옵션을 추가했습니다. 이 옵션이 지정되면ensurepip모듈은 해당 디렉토리에서setuptools및pip휠 패키지를 찾습니다. 두 패키지가 모두 존재하면, ensurepip에 포함된 휠 대신 해당 패키지들이 사용됩니다.일부 리눅스 배포판 패키징 정책은 종속성을 번들로 포함하지 않을 것을 권장합니다. 예를 들어, Fedora는 wheel 패키지를
/usr/share/python-wheels/디렉토리에 설치하고ensurepip._bundled패키지를 설치하지 않습니다.(Victor Stinner가 bpo-42856 을 통해 기여함.)
libpythonMAJOR.MINOR.a정적 라이브러리를 빌드하지 않고python.o오브젝트 파일을 설치하지 않는 새로운configure --without-static-libpython option옵션을 추가했습니다.(Victor Stinner가 bpo-43103 을 통해 기여함.)
configure스크립트는 이제 가능한 경우 Tcl/Tk 헤더 및 라이브러리의 위치를 감지하기 위해pkg-config유틸리티를 사용합니다. 이전과 마찬가지로, 해당 위치는--with-tcltk-includes및--with-tcltk-libs구성 옵션으로 명시적으로 지정할 수 있습니다. (Manolis Stamatogiannakis가 bpo-42603 을 통해 기여함.)configure스크립트에--with-openssl-rpath옵션을 추가했습니다. 이 옵션은 사용자 정의 OpenSSL 설치 경로를 사용하여 파이썬을 빌드하는 과정을 단순화합니다(예:./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto). (Christian Heimes가 bpo-43466 을 통해 기여함.)
C API 변경 사항¶
PEP 652: 안정적인 ABI 유지¶
확장 모듈 또는 파이썬 임베딩을 위한 안정적인 ABI(Application Binary Interface)가 이제 명시적으로 정의됩니다. C API 및 ABI 안정성 은 안정적 ABI 사용을 위한 모범 사례와 함께 C API 및 ABI 안정성 보장을 설명합니다.
새로운 기능들¶
The result of
PyNumber_Index()now always has exact typeint. Previously, the result could have been an instance of a subclass ofint. (Contributed by Serhiy Storchaka in bpo-40792.)PyConfig구조체에 새로운orig_argv멤버를 추가했습니다. 이는 파이썬 실행 파일에 전달된 원래의 명령줄 인자 목록입니다. (Victor Stinner가 bpo-23427 을 통해 기여함.)datetime.datetime및datetime.time객체의tzinfo어트리뷰트에 접근하기 위한PyDateTime_DATE_GET_TZINFO()및PyDateTime_TIME_GET_TZINFO()매크로가 추가되었습니다. (Zackery Spytz가 bpo-30155 를 통해 기여함.)코덱 검색 함수를 등록 해제하는
PyCodec_Unregister()함수를 추가했습니다. (Hai Shi가 bpo-41842 를 통해 기여함.)StopIteration예외를 발생시키지 않고 이터레이터에 값을 보내는 것을 허용하는PyIter_Send()함수를 추가했습니다. (Vladimir Matveev가 bpo-41756 을 통해 기여함.)PyUnicode_AsUTF8AndSize()를 제한된 C API에 추가했습니다. (Alex Gayor가 bpo-41784 를 통해 기여함.)PyModule_AddObjectRef()함수를 추가했습니다. 이는PyModule_AddObject()와 유사하지만 성공 시 값에 대한 참조를 훔치지 않습니다. (Victor Stinner가 bpo-1635741 을 통해 기여함.)객체의 참조 횟수를 증가시키고 객체를 반환하는
Py_NewRef()및Py_XNewRef()함수를 추가했습니다. (Victor Stinner가 bpo-42262 를 통해 기여함.)PyType_FromSpecWithBases()및PyType_FromModuleAndSpec()함수가 이제 bases 인자로 단일 클래스를 허용합니다. (Serhiy Storchaka가 bpo-42423 을 통해 기여함.)PyType_FromModuleAndSpec()함수가 이제 NULLtp_doc슬롯을 허용합니다. (Hai Shi가 bpo-41832 를 통해 기여함.)PyType_GetSlot()함수가 이제 정적 타입 을 허용합니다. (Hai Shi와 Petr Viktorin이 bpo-41073 를 통해 기여함.)객체가
set의 인스턴스이지만 서브 타입의 인스턴스는 아닌지 확인하는 새로운PySet_CheckExact()함수를 C-API에 추가했습니다. (Pablo Galindo가 bpo-43277 을 통해 기여함.)모의(simulate)를 위해 시그널 번호를 전달할 수 있는
PyErr_SetInterruptEx()를 추가했습니다. (Antoine Pitrou가 bpo-43356 을 통해 기여함.)파이썬이 디버그 모드에서 빌드된 경우 (즉,
Py_DEBUG매크로가 정의된 경우)에도 제한된 C API를 지원합니다. 제한된 C API에서 파이썬이 디버그 모드에서 빌드되고Py_LIMITED_API매크로가 파이썬 3.10 이상을 대상으로 하는 경우,Py_INCREF()및Py_DECREF()함수는 이제PyObject.ob_refcnt멤버에 직접 접근하는 대신 불투명한(opaque) 함수 호출로 구현됩니다. 파이썬 3.8부터PyObject구조가 릴리스 및 디버그 모드에서 동일해졌기 때문에(참조: bpo-36465) 디버그 모드에서도 제한된 C API를 지원할 수 있게 되었습니다.--with-trace-refs특별 빌드(Py_TRACE_REFS매크로)에서는 여전히 제한된 C API를 지원하지 않습니다. (Victor Stinner가 bpo-43688 을 통해 기여함.)파이썬의
x is y와 동일하게 x 객체가 y 객체인지 확인하는Py_Is(x, y)함수를 추가했습니다. 또한 객체가 각각None싱글톤,True싱글톤 또는False싱글톤인지 테스트하는Py_IsNone(),Py_IsTrue(),Py_IsFalse()함수도 추가했습니다. (Victor Stinner가 bpo-43753 을 통해 기여함.)C 코드에서 가비지 수거기를 제어하기 위한 새 함수들을 추가했습니다:
PyGC_Enable(),PyGC_Disable(),PyGC_IsEnabled(). 이 함수들은gc모듈을 임포트하지 않고도 C 코드에서 가비지 수거기의 활성화 여부를 전환하고 상태를 조회할 수 있게 해줍니다.형 인스턴스 생성을 금지하는 새로운
Py_TPFLAGS_DISALLOW_INSTANTIATION타입 플래그를 추가했습니다. (Victor Stinner가 bpo-43916 을 통해 기여함.)불변 형 객체를 생성하기 위한 새로운
Py_TPFLAGS_IMMUTABLETYPE타입 플래그를 추가했습니다. 이 플래그가 설정된 경우 형 어트리뷰트를 설정하거나 삭제할 수 없습니다. (Victor Stinner와 Erlend E. Aasland가 bpo-43908 을 통해 기여함.)
파이썬 3.10로 이식¶
es#,et#,s#,u#,y#,z#,U#및Z#와 같이#을 사용하는PyArg_ParseTuple()및Py_BuildValue()형식을 사용하려면 이제PY_SSIZE_T_CLEAN매크로가 정의되어 있어야 합니다. 자세한 내용은 인자 구문 분석과 값 구축 및 PEP 353 을 참조하십시오. (Victor Stinner가 bpo-40943 을 통해 기여함.)Py_REFCNT()가 인라인 정적 함수로 변경되었으므로,Py_REFCNT(obj) = new_refcnt는Py_SET_REFCNT(obj, new_refcnt)로 교체해야 합니다. 자세한 내용은Py_SET_REFCNT()를 참조하십시오(Python 3.9부터 사용 가능). 하위 호환성을 위해 이 매크로를 사용할 수 있습니다:#if PY_VERSION_HEX < 0x030900A4 # define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0) #endif
(Victor Stinner가 bpo-39573 을 통해 기여함.)
GIL 을 보유하지 않고
PyDict_GetItem()을 호출하는 것이 과거의 이유로 허용되었으나, 더 이상 허용되지 않습니다. (Victor Stinner가 bpo-40839 를 통해 기여함.)PyUnicode_FromUnicode(NULL, size)및PyUnicode_FromStringAndSize(NULL, size)가 이제DeprecationWarning을 발생시킵니다. 초기 데이터 없이 유니코드 객체를 할당하려면PyUnicode_New()를 사용하십시오. (Inada Naoki가 bpo-36346 를 통해 기여함.)PyCapsule API
unicodedata.ucnhash_CAPI의 비공개_PyUnicode_Name_CAPI구조체가 내부 C API로 이동되었습니다. (Victor Stinner가 bpo-42157 을 통해 기여함.)Py_GetPath(),Py_GetPrefix(),Py_GetExecPrefix(),Py_GetProgramFullPath(),Py_GetPythonHome()및Py_GetProgramName()함수는 이제Py_Initialize()호출 전(파이썬 초기화 전)에 호출될 경우NULL을 반환합니다. 파이썬 초기화 구성 를 가져오려면 새로운 Python 경로 설정 API를 사용하십시오. (Victor Stinner가 bpo-42260 을 통해 기여함.)PyList_SET_ITEM(),PyTuple_SET_ITEM()및PyCell_SET()매크로는 더 이상 l-value 또는 r-value로 사용할 수 없습니다. 예를 들어,x = PyList_SET_ITEM(a, b, c)및PyList_SET_ITEM(a, b, c) = x는 이제 컴파일러 오류를 발생시킵니다. 이는if (PyList_SET_ITEM (a, b, c) < 0) ...와 같은 테스트의 버그를 방지합니다. (Zackery Spytz와 Victor Stinner가 bpo-30459 를 통해 기여함.)비제한 API 파일인
odictobject.h,parser_interface.h,picklebufobject.h,pyarena.h,pyctype.h,pydebug.h,pyfpe.h및pytime.h가Include/cpython디렉토리로 이동되었습니다. 이 파일들은 이미Python.h에 포함되어 있으므로 직접 포함해서는 안 됩니다. 자세한 내용은 인클루드 파일 를 참조하십시오. 해당 파일들을 직접 포함하고 있다면 대신Python.h를 포함하는 것을 고려하십시오. (Nicholas Sim이 bpo-35134 를 통해 기여함.)불변 형 객체를 생성하려면
Py_TPFLAGS_IMMUTABLETYPE타입 플래그를 사용하십시오. 형 객체가 가변인지 여부를 판단하기 위해Py_TPFLAGS_HEAPTYPE에 의존하지 말고, 대신Py_TPFLAGS_IMMUTABLETYPE이 설정되어 있는지 확인하십시오. (Victor Stinner와 Erlend E. Aasland가 bpo-43908 을 통해 기여함.)문서화되지 않은 함수인
Py_FrozenMain이 제한된 API에서 제거되었습니다. 이 함수는 주로 파이썬의 사용자 정의 빌드에 유용합니다. (Petr Viktorin이 bpo-26241 을 통해 기여함.)
폐지됨¶
PyUnicode_InternImmortal()함수가 이제 폐지되었으며 파이썬 3.12에서 제거될 예정입니다. 대신PyUnicode_InternInPlace()를 사용하십시오. (Victor Stinner가 bpo-41692 를 통해 기여함.)
제거됨¶
Py_UNICODE*문자열을 처리하는Py_UNICODE_str*함수들이 제거되었습니다. (Inada Naoki가 bpo-41123 을 통해 기여함.)Py_UNICODE_strlen:PyUnicode_GetLength()또는PyUnicode_GET_LENGTH를 사용하십시오.Py_UNICODE_strcat:PyUnicode_CopyCharacters()또는PyUnicode_FromFormat()을 사용하십시오.Py_UNICODE_strcpy,Py_UNICODE_strncpy:PyUnicode_CopyCharacters()또는PyUnicode_Substring()을 사용하십시오.Py_UNICODE_strcmp:PyUnicode_Compare()를 사용하십시오.Py_UNICODE_strncmp:PyUnicode_Tailmatch()를 사용하십시오.Py_UNICODE_strchr,Py_UNICODE_strrchr:PyUnicode_FindChar()를 사용하십시오.
`PyUnicode_GetMax()이 제거되었습니다. 새로운 (PEP 393) API로 마이그레이션하십시오. (Inada Naoki가 bpo-41103 을 통해 기여함.)`PyLong_FromUnicode()가 제거되었습니다.PyLong_FromUnicodeObject()로 마이그레이션하십시오. (Inada Naoki가 bpo-41103 을 통해 기여함.)`PyUnicode_AsUnicodeCopy()가 제거되었습니다.PyUnicode_AsUCS4Copy()또는PyUnicode_AsWideCharString()을 사용하십시오. (Inada Naoki가 bpo-41103 을 통해 기여함.)_Py_CheckRecursionLimit변수를 제거했습니다. 이 변수는PyInterpreterState구조체의ceval.recursion_limit으로 대체되었습니다. (Victor Stinner가 bpo-41834 에서 기여).문서화되지 않은 매크로
Py_ALLOW_RECURSION및Py_END_ALLOW_RECURSION과PyInterpreterState구조체의recursion_critical필드를 제거했습니다. (Serhiy Storchaka가 bpo-41936 에서 기여).문서화되지 않은
PyOS_InitInterrupts()함수를 제거했습니다. 파이썬을 초기화하면 이미 암시적으로 시그널 처리기가 설치됩니다. 자세한 내용은PyConfig.install_signal_handlers를 참조하십시오. (Victor Stinner가 bpo-41713 에서 기여).PyAST_Validate()함수를 제거했습니다. 이제 공용 C API로 AST 객체(mod_ty타입)를 생성할 수 없습니다. 해당 함수는 이미 제한된 C API에서 제외되었습니다 (PEP 384). (Victor Stinner가 bpo-43244 에서 기여).symtable.h헤더 파일과 문서화되지 않은 함수들을 제거했습니다:PyST_GetScope()PySymtable_Build()PySymtable_BuildObject()PySymtable_Free()Py_SymtableString()Py_SymtableStringObject()
Py_SymtableString()함수가 실수로 안정적인 ABI에 포함되었으나,symtable.h헤더 파일이 제한된 C API에서 제외되어 사용할 수 없었습니다.대신 파이썬
symtable모듈을 사용하십시오. (Victor Stinner가 bpo-43244 에서 기여).제한된 C API 헤더와 윈도우에서 안정적인 ABI를 제공하는 라이브러리인
python3.dll에서PyOS_ReadlineFunctionPointer()를 제거했습니다. 해당 함수는FILE*인자를 받기 때문에 ABI 안정성을 보장할 수 없습니다. (Petr Viktorin이 bpo-43868 에서 기여).ast.h,asdl.h,Python-ast.h헤더 파일을 제거했습니다. 이 함수들은 문서화되지 않았으며 제한된 C API에서 제외되었습니다. 이 헤더 파일에 정의된 대부분의 이름은Py접두사가 붙지 않아 이름 충돌을 일으킬 수 있었습니다. 예를 들어,Python-ast.h에 정의된Yield매크로는 윈도우의<winbase.h>헤더에서 사용하는Yield라는 이름과 충돌했습니다. 대신 파이썬ast모듈을 사용하십시오. (Victor Stinner가 bpo-43244 에서 기여).공용 AST C API가 제거됨에 따라
struct _mod타입을 사용하는 컴파일러 및 파서 함수들을 제거했습니다:PyAST_Compile()PyAST_CompileEx()PyAST_CompileObject()PyFuture_FromAST()PyFuture_FromASTObject()PyParser_ASTFromFile()PyParser_ASTFromFileObject()PyParser_ASTFromFilename()PyParser_ASTFromString()PyParser_ASTFromStringObject()
이 함수들은 문서화되지 않았으며 제한된 C API에서 제외되었습니다. (Victor Stinner가 bpo-43244 에서 기여).
다음 함수들이 포함된
pyarena.h헤더 파일을 제거했습니다:PyArena_New()PyArena_Free()PyArena_Malloc()PyArena_AddPyObject()
이 함수들은 문서화되지 않았으며 제한된 C API에서 제외되었고 컴파일러 내부에서만 사용되었습니다. (Victor Stinner가 bpo-43244 에서 기여).
파이썬 최적화를 위해
PyThreadState.use_tracing멤버를 제거했습니다. (Mark Shannon이 bpo-43760 에서 기여).
3.10.7의 주요 보안 기능¶
2(이진수), 4, 8(팔진수), 16(16진수) 또는 32가 아닌 기반(예: 10(십진수))에서 int 와 str 간의 변환 시, 문자열 형태의 자릿수가 제한을 초과하면 알고리즘 복잡도로 인한 잠재적인 서비스 거부(DoS) 공격을 방지하기 위해 ValueError 를 발생시킵니다. 이는 CVE 2020-10735 에 대한 완화 조치입니다. 이 제한은 환경 변수, 명령줄 플래그 또는 sys API를 통해 설정하거나 비활성화할 수 있습니다. 자세한 내용은 정수 문자열 변환 길이 제한 문서를 참조하십시오. 기본 제한은 문자열 형태에서 4300자입니다.
3.10.8의 주요 보안 기능¶
폐지된 mailcap 모듈은 이제 셸 명령에 안전하지 않은 텍스트(파일명, MIME 유형, 매개변수)를 삽입하는 것을 거부합니다. 이러한 텍스트를 사용하는 대신 경고를 표시하고 일치하는 항목이 없는 것처럼 처리합니다(테스트 명령의 경우 테스트가 실패한 것처럼 처리). (Petr Viktorin이 gh-98966 에서 기여).
3.10.12의 주요 변경 사항¶
tarfile¶
tarfile의 추출 메서드와shutil.unpack_archive()에 대상 디렉터리 외부에 파일을 생성하는 등 예상치 못한 동작이나 위험한 tar 기능을 제한할 수 있는 새로운 filter 인수가 추가되었습니다. 자세한 내용은 추출 필터 를 참조하십시오. Python 3.12부터는 filter 인수 없이 사용하는 경우DeprecationWarning이 표시됩니다. Python 3.14에서는 기본값이'data'로 변경됩니다. (Petr Viktorin이 PEP 706 에서 기여).