파이썬 3.8의 새로운 변경사항

2023년 05월 07일

Python

# 파이썬# 3.8

📕 목차

개요

이 글은 파이썬 3.8 버전의 새로운 변경사항을 소개합니다.

Python 3.8 배포 주요 사항

파이썬 3.8 버전은 2019년 10월 14일에 릴리즈 되었습니다.

대입 표현식 (Assignment Expressions)

PEP 572에서 소개된 대입 표현식은 := 연산자를 사용하여 변수에 값을 할당하고, 그 값을 반환하는 표현식입니다. 바다 코끼리의 눈과 엄니를 닮아서 “바다코끼리 연산자”라고 부른다고 합니다.

이 기능이 도입되기 이전에는 다음과 같이 바깥 스코프에서 변수 선언을 해야했습니다.

a = [1, 2, 3, 4]
len_a = len(a)

if len_a > 10:
    print(f"List is too long ({len_a} elements, expected <= 10)")

대입 표현식을 사용한다면 이제 다음과 같이 표현이 가능합니다.

a = [1, 2, 3, 4]

if (n := len(a)) > 10: # 대입 연산자 사용
    print(f"List is too long ({n} elements, expected <= 10)")

대입 표현식을 통해서 코드를 더 간결하게 만들어서 가독성을 개선할 수 있을 것 같습니다.

위치 전용 매개 변수

PEP 570에서 소개된 위치 전용 매개 변수는 /를 사용하여 위치 전용 매개 변수를 정의할 수 있습니다.

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

컴파일된 바이트 코드 파일을 위한 병렬 파일 시스템 캐시

새로운 PYTHONPYCACHEPREFIX 설정은 각 소스 디렉토리의 기본 __pycache__ 서브디렉토리를 사용하는 대신에, 별도의 병렬 파일 시스템 트리를 사용하여 암묵적인 바이트 코드 캐시를 구성합니다.

캐시의 위치는 sys.pycache_prefix를 통해 알 수 있습니다. 이 값이 None이라면 기본 위치는 __pycache__ 서브디렉토리입니다.

디버그 빌드는 릴리스 빌드와 같은 ABI를 사용합니다.

f-문자열은 스스로 설명하는 표현식과 디버깅을 위해 =를 지원합니다.

f-string에 = 지시자가 추가되었습니다. `f’{expr=}‘와 같은 f-string은 f’{expr=평가된 식}‘과 같이 확장됩니다. 예를들어 다음과 같습니다.

user = 'eric_idle'
print(f'{user=}') # "user='eric_idle'"을 출력합니다.

PEP 578: 파이썬 런타임 감사 훅

The PEP adds an Audit Hook and Verified Open Hook. Both are available from Python and native code, allowing applications and frameworks written in pure Python code to take advantage of extra notifications, while also allowing embedders or system administrators to deploy builds of Python where auditing is always enabled.

See PEP 578 for full details.

PEP 587: 파이썬 초기화 구성

PEP 587은 전체 설정과 더 나은 에러 리포팅을 위한 섬세한 제어를 제공하는 파이썬 초기화 설정을 위한 새로운 C API를 추가합니다.

  1. 새로운 구조체

    • PyConfig: 파이썬을 설정하기 위한 대부분의 파라미터를 포함하는 구조체입니다.
    • PyPreConfig: 파이썬의 preinitialize에 사용되는 구조체
    • PyStatus: success, error, exit 중 하나인 상태를 나타내는 초기화 상태를 저장하는 구조체
    • PyWideStringList
  2. 새로운 함수들

    • PyConfig_Clear()
    • PyConfig_InitIsolatedConfig()
    • PyConfig_InitPythonConfig()
    • PyConfig_Read()
    • PyConfig_SetArgv()
    • PyConfig_SetBytesString()
    • PyConfig_SetString()
    • PyPreConfig_InitIsolatedConfig()
    • PyPreConfig_InitPythonConfig()
    • PyStatus_Error()
    • PyStatus_Exception()
    • PyStatus_Exit()
    • PyStatus_IsError()
    • PyStatus_IsExit()
    • PyStatus_NoMemory()
    • PyStatus_Ok()
    • PyWideStringList_Append()
    • PyWideStringList_Insert()
    • Py_ByteMain()
    • Py_ExitStatusException()
    • Py_InitializeFromConfig()
    • Py_PreInitialize()
    • Py_PreInitializeFromArgs()
    • Py_PreInitializeFromBytesArgs()
    • Py_RunMain()

This PEP also adds _PyRuntimeState.preconfig (PyPreConfig type) and PyInterpreterState.config (PyConfig type) fields to these internal structures. PyInterpreterState.config becomes the new reference configuration, replacing global configuration variables and other private variables.

자세한 내용은 Python Initialization Configuration을 참고하세요.

PEP 590: 벡터콜 - CPython을 위한 빠른 호출 프로토콜

벡터콜(vectorcall) 프로토콜은 CPython에서 함수 호출을 더 빠르게 만들기 위한 새로운 호출 프로토콜입니다. 벡터콜은 함수 호출을 위한 새로운 파이썬/C API를 추가합니다. 이 제안은 이미 다양한 클래스에 이미 적용된 최적화를 공식화하기 위한 것입니다. 콜러블(callable)을 구현하는 정적타입들은 이 프로토콜을 사용할 수 있습니다.

이 PEP는 파이썬 3.8버전에서는 제안이고 파이썬 3.9부터 추가됩니다.

PEP 574: 아웃 오브 밴드 데이터 버퍼를 사용하는 피클 프로토콜 5

피클은 사이즈가 큰 데이터를 파이썬 프로세스 간에 전송할 때, 멀티 코어 혹은 멀티-머신 프로세싱의 이점을 얻기 위해서 사용되는데, 이 과정에서 메모리 카피를 줄임 및 몇 가지 커스텀 기법들을 사용해서 전송을 최적화하는 것이 중요한 포인트입니다.

PEP 3118 – Revising the buffer protocol과 호환되는 데이터가 통신 레이어에서의 판단에 따라, 메인 피클 스트림으부터 각각 전송될 수 있도록하는 아웃 오브 밴드 데이터 버퍼(out-of-band data buffers)를 지원을 도입했습니다.

profile

박민기

단순하게 살아라. 현대인은 쓸데없는 절차와 일 때문에 얼마나 복잡한 삶을 살아가는가? - 이드리스 샤흐

© 2023, 미나리와 함께 만들었음