본문 바로가기
Python

Python 3.12 - 주요 내용과 예제로 살펴보기

by 올엠 2024. 11. 11.
반응형

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)

주요 제거 및 사용 중단

  1. distutils 패키지 제거:
    • distutils 패키지가 표준 라이브러리에서 제거되었습니다. 대신 setuptools 패키지를 사용해야 한다 (PEP 632)
  2. 기타 제거된 모듈:
    • asynchat, asyncore, imp 모듈이 제거되었다

보안 개선

  1. SHA 및 MD5 해시 알고리즘:
    • hashlib 모듈의 SHA1, SHA3, SHA2-384, SHA2-512, MD5 구현이 보안과 신뢰성을 강화하기 위해 HACL* 프로젝트의 정식 검증된 코드로 대체되었다

Python 3.12 릴리스 노트를 참고하였다.

반응형