백엔드 개발 공부, Django로 ‘4개월’이면 가능해요
#소프트웨어 

Python 3.12 새로운 기능

Python 3.12.3은 2024년 4월 9일 출시되었으며, 유연한 f-string, 새로운 타입 어노테이션, 성능 향상 등 다양한 기능을 추가했습니다.

2024-04-25 | 김성혁

Python 3.12

Python 3.12.3 버전이 2024년 4월 9일에 출시되었습니다. 이는 Python 3.12 시리즈의 세 번째 유지보수 릴리스로, 3.12.2 이후 300개가 넘는 버그 수정, 빌드 개선, 문서 변경이 포함되어 있습니다. Python 3.12는 Python 프로그래밍 언어의 최신 주요 릴리스로, 많은 새로운 기능과 최적화가 추가되었습니다.

3.12 시리즈의 주요 새로운 기능은 다음과 같습니다:

  • 더욱 유연해진 f-string 파싱(PEP 701)
  • Python 코드 내 버퍼 프로토콜 지원(PEP 688)
  • 새로운 디버깅/프로파일링 API(PEP 669)
  • 분리된 Global Interpreter Locks를 가진 격리된 서브인터프리터 지원(PEP 684)
  • 더욱 개선된 오류 메시지와 오타로 인한 예외 발생 시 사용자에게 제안을 제공
  • Linux perf 프로파일러가 트레이스에서 Python 함수 이름을 보고하도록 지원
  • PEP 709과 BOLT 이진 최적화기 지원과 같은 많은 크고 작은 성능 향상, 전체적으로 약 5%의 성능 향상을 제공합니다.

새롭게 추가된 타입 어노테이션 입니다.

  • 제네릭 클래스에 대한 새로운 형 어노테이션 구문(PEP 695)
  • 메서드에 대한 새로운 재정의 데코레이터(PEP 698)

이 중 몇개를 코드와 함께 보고자합니다.

PEP 701: f- 문자열의 구문 형식화

PEP 701은 f-string 사용에 대한 일부 제한을 해제합니다. f-string 내부의 표현식 구성 요소는 이제 동일한 따옴표를 사용하는 문자열, 여러 줄 표현식, 주석, 백슬래시 및 유니코드 이스케이프 시퀀스를 포함하여 유효한 Python 표현식이 될 수 있습니다. 이제 이들을 자세히 살펴보겠습니다:

  • 따음표 재사용: 파이썬 3.11에서 묶는 f- 문자열과 동일한 따옴표를 재사용하면 SyntaxError가 발생하여 사용자가 사용 가능한 다른 따옴표를 사용하거나(예: f- 문자열이 작은따옴표를 사용하는 경우 큰따옴표 또는 큰따옴표 세 개 사용), 다른 따옴표를 사용하도록 강제합니다. 파이썬 3.12에서는 이제 이와 같은 작업을 수행할 수 있습니다:
    >>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
    >>> f"This is the playlist: {", ".join(songs)}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'

    이 변경 전에는 f- 문자열 중첩 방식에 명시적인 제한이 없었지만, f- 문자열의 표현식 구성 요소 내에서 문자열 따옴표를 재사용할 수 없다는 사실 때문에 임의로 f- 문자열을 중첩하는 것이 불가능해졌음을 참고하세요. 실제로 이것은 작성할 수 있는 가장 중첩된 f-스트링입니다:

    >>> f"""{f'''{f'{f"{1+1}"}'}'''}"""
    '2'

    이제 f-스트링은 표현식 컴포넌트 내에 유효한 파이썬 표현식을 포함할 수 있으므로 이제 f-스트링을 임의로 중첩할 수 있습니다:

    >>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"
    '2'
  • 여러 줄 표현식과 주석: 파이썬 3.11에서는 f-스트링 표현식이 일반적으로 여러 줄에 걸쳐 정의되어 읽기 어렵게 만드는 경우(리터럴 리스트가 여러 줄에 걸쳐 정의되는 경우 등)에도 한 줄에 정의해야 합니다. 이제 Python 3.12에서는 여러 줄에 걸친 f-스트링을 정의하고 인라인 주석을 추가할 수 있습니다:
    >>> f"This is the playlist: {", ".join([
    ...     'Take me back to Eden',  # My, my, those eyes like fire
    ...     'Alkaline',              # Not acid nor alkaline
    ...     'Ascensionism'           # Take to the broken skies at last
    ... ])}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    
  • 백슬래시 및 유니코드 문자: 파이썬 3.12 이전에는 f- 문자열 표현식에 \ 문자를 포함할 수 없었습니다. 이는 유니코드 이스케이프 시퀀스 (예: \N{snowman})에도 영향을 미쳤는데, 이전에는 f- 문자열의 표현식 구성 요소에 포함될 수 없었던 \N 부분이 포함되었기 때문입니다. 이제 다음과 같은 표현식을 정의할 수 있습니다:
    >>> print(f"This is the playlist: {"\n".join(songs)}")
    This is the playlist: Take me back to Eden
    Alkaline
    Ascensionism
    >>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}")
    This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism

PEP 695: 유형 매개변수

PEP484의 일반 클래스 및 함수는 유형 매개변수의 범위가 불분명하고 분산에 대한 명시적인 선언이 필요한 장황한 구문을 사용하여 선언되었습니다.

PEP 695에서는일반 클래스와 함수를 만드는 새롭고 더 간결하고 명시적인 방법이 도입되었습니다:

def max[T](args: Iterable[T]) -> T:
    ...

class list[T]:
    def __getitem__(self, index: int, /) -> T:
        ...

    def append(self, element: T) -> None:
        ...

또한 PEP는 TypeAliasType의 인스턴스를 생성하는 type 문을 사용하여 유형 별칭을선언하는 새로운 방법을 도입합니다:

type Point = tuple[float, float]

유형 별칭은 일반 별칭으로도 사용할 수 있습니다:

type Point[T] = tuple[T, T]

새로운 구문을 사용하면 TypeVarTuple 및 ParamSpec 매개변수와 바운드 또는 제약 조건이 있는 TypeVar매개변수를 선언할 수 있습니다:

type IntFunc[**P] = Callable[P, int]  # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts]  # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T]  # TypeVar with bound
type IntOrStrSequence[T: (int, str)] = Sequence[T]  # TypeVar with constraints

이 구문을 통해 생성된 유형 별칭의 값과 유형 변수의 바운드 및 제약 조건은 필요할 때만 평가됩니다(지연 평가 참조). 즉, 유형 별칭은 파일의 뒷부분에 정의된 다른 유형을 참조할 수 있습니다.

타입 매개변수 목록을 통해 선언된 타입 매개변수는 선언의 범위와 중첩된 범위 내에서 볼 수 있지만 외부 범위에서는 볼 수 없습니다. 예를 들어, 제네릭 클래스의 메서드에 대한 타입 주석이나 클래스 본문에서 사용할 수 있습니다. 그러나 클래스가 정의된 후에는 모듈 범위에서는 사용할 수 없습니다. 타입 매개변수의 런타임 의미에 대한 자세한 설명은 타입 매개변수 목록을 참조하세요.

이러한 스코핑 의미를 지원하기 위해 어노테이션 스코프라는 새로운 종류의 스코프가 도입되었습니다. 어노테이션 범위는 대부분 함수 범위처럼 동작하지만, 둘러싸는 클래스 범위와 다르게 상호작용합니다. 파이썬 3.13에서는 어노테이션도 어노테이션 범위에서 평가됩니다.