반응형
Python 3.12의 주요 변경 사항을 요약하면 다음과 같다
새로운 기능 및 개선 사항
1. 유연한 f-string 구문 분석:
- 이제 f-string 내부에서 더 많은 표현식을 사용할 수 있습니다. 여러 줄 표현식, 주석, 백슬래시, 유니코드 이스케이프 시퀀스 등을 포함할 수 있게되었다.
#아래와 백슬래쉬를 쉽게 사용이 가능하게 되었다.
>>> a = ["hello", "world"]
>>> f"{'\n'.join(a)}"
'hello\nworld'
2. 타입 주석 개선:
- 제네릭 클래스와 함수에 대한 새로운 타입 주석 구문이 도입되었다 (PEP 695)이는 제네릭 타입을 사용하는 구문을 더 직관적이고 명확하게 만들어, Python 개발자들이 타입 힌팅을 더 쉽게 사용할 수 있도록 하는 것을 목표로 한다.
# 기존 방식
from typing import Generic, TypeVar
T = TypeVar("T")
class MyClass(Generic[T]):
def method(self, value: T) -> T:
return value
# 새로운 방식
class MyClass[T]:
def method(self, value: T) -> T:
return value
- 메서드에 대한 override 데코레이터가 추가되었다 (PEP 698), 클래스 메서드가 부모 클래스의 메서드를 오버라이드하려는 의도를 명확히 표시하는 데 사용된다.
from typing import override
class Parent:
def foo(self) -> int:
return 1
def bar(self, x: str) -> str:
return x
class Child(Parent):
@override
def foo(self) -> int:
return 2
@override
def baz(self) -> int: # 타입 체커 오류: 부모 클래스에 일치하는 메서드가 없음
return 1
3. 고립된 서브 인터프리터 지원:
- 각 서브 인터프리터가 별도의 GIL(Global Interpreter Lock)을 가질 수 있게 되어, 멀티코어 CPU를 더 효과적으로 활용할 수 있다 (PEP 684). 이를 통해서 기존 GIL의 스레드 성능 문제를 개선했다.
import _xxsubinterpreters as interpreters
import threading
# 서브 인터프리터 생성
interp1 = interpreters.create()
interp2 = interpreters.create()
# 서브 인터프리터에서 실행할 코드
code = """
import time
for i in range(5):
print(f"Interpreter {interpreters.get_current()} - {i}")
time.sleep(1)
"""
# 서브 인터프리터에서 스레드 실행 함수
def run_in_interpreter(interp, code):
interpreters.run_string(interp, code)
# 스레드 생성 및 실행
thread1 = threading.Thread(target=run_in_interpreter, args=(interp1, code))
thread2 = threading.Thread(target=run_in_interpreter, args=(interp2, code))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
향상된 오류 메시지:
- NameError, ImportError, SyntaxError 등의 예외에 대해 더 나은 ‘Did you mean …’ 제안이 제공된다. 오류에 대한 해결 방안을 추천해주는 방식으로 보다 쉽게 오류 해결을 돕는다.
# Python 3.11 및 이전 버전
>>> sys.stdlib_module_names
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined
# Python 3.12
>>> sys.stdlib_module_names
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined. Did you forget to import 'sys'?
성능 개선:
- 여러 성능 개선이 이루어졌으며, 일부 벤치마크에서 최대 75%의 속도 향상이 보고되었습니다
## 인라인 컴프리헨션 (Inlined Comprehensions)
# Python 3.11 및 이전 버전
numbers = [i for i in range(1000000)]
# Python 3.12
numbers = [i for i in range(1000000)]
## 더 많은 특수화 (More Specializations)
# Python 3.11 및 이전 버전
text = "hello world"
upper_text = text.upper()
# Python 3.12
text = "hello world"
upper_text = text.upper()
## 객체 헤더 크기 감소 (Reduced Object Header Size)
# Python 3.11 및 이전 버전
class MyClass:
def __init__(self, value):
self.value = value
obj = MyClass(10)
# Python 3.12
class MyClass:
def __init__(self, value):
self.value = value
obj = MyClass(10)
주요 제거 및 사용 중단
- distutils 패키지 제거:
- distutils 패키지가 표준 라이브러리에서 제거되었습니다. 대신 setuptools 패키지를 사용해야 한다 (PEP 632)
- 기타 제거된 모듈:
- asynchat, asyncore, imp 모듈이 제거되었다
보안 개선
- SHA 및 MD5 해시 알고리즘:
- hashlib 모듈의 SHA1, SHA3, SHA2-384, SHA2-512, MD5 구현이 보안과 신뢰성을 강화하기 위해 HACL* 프로젝트의 정식 검증된 코드로 대체되었다
Python 3.12 릴리스 노트를 참고하였다.
반응형