URL: https://www.youtube.com/watch?v=bgeqL4Btou0
원문 제목: 8 Python 3.15 Features You Need to Know
채널: ArjanCodes
원본 발행일: 2026-10-02
처리일: 2026-10-03
재생 시간: 12:48
📌 핵심 질문 / Python 3.15가 실무 코드에 가져오는 변화
==Python 3.15는 획기적인 단일 기능보다 import 지연, 불변 자료구조, 센티널, 컴프리헨션 언패킹, 프로파일링, 인코딩, 타입 시스템, 실행 엔진을 작게 넓게 개선한다.==
lazy import는 모듈을 실제로 사용할 때까지 로딩을 미뤄 대형 애플리케이션의 시작 비용을 줄인다.frozen dict와 표준sentinel은 설정·캐시 키·선택적 인자 같은 API 설계를 더 명확하고 안전하게 만든다.profiling.sampling(Tachyon), UTF-8 기본 인코딩,TypedDict의 추가 항목,TypeForm, JIT와 free-threading 개선은 운영·이식성·라이브러리 생태계에 영향을 준다.
Python 3.15의 가치는 모든 프로그램이 동일한 속도 향상을 얻는다는 데 있지 않다. 기존 우회 패턴을 줄이고, 의존성과 타입의 의도를 코드에 더 가깝게 표현하며, 관측성과 실행 최적화의 선택지를 넓힌다는 데 있다. 가장 눈에 띄는 변화는 lazy import와 frozen dict지만, 샘플링 프로파일러와 플랫폼 독립적인 UTF-8 기본값처럼 운영 단계에서 누적 효과를 내는 변화도 함께 들어온다.
1. 지연 import로 시작 비용과 의존성 가시성을 함께 조절한다
lazy import는 import 선언을 파일 상단에 남겨 두면서 실제 로딩은 첫 사용 시점까지 미루는 기능이다.
1.1. 대형 애플리케이션의 기존 import 문제
-
사용하지 않는 모듈도 시작 시 로드되는 비용
- 대형 애플리케이션의 startup phase: 실행 경로에 따라 실제로 사용하지 않는 모듈까지 import하면 애플리케이션 시작에 시간이 걸린다.
- 실행마다 달라지는 필요성: 어떤 실행에서는 데이터 분석 모듈이 필요하지만, 다른 실행에서는 해당 기능을 전혀 호출하지 않을 수 있다.
-
함수 안으로 import를 옮기는 기존 우회법
- 비용이 큰 import의 이동: 데이터 분석 함수 안에서 Pandas, NumPy 같은 모듈을 import하면 모듈이 필요할 때까지 로딩을 늦출 수 있다.
- 의존성 선언의 분산: import가 여러 함수로 흩어지면서 파일 상단만 읽고도 스크립트의 의존성을 파악하기 어려워진다.
1.2. lazy import의 동작 방식
-
상단 선언과 첫 사용 시 로딩
- 새 키워드:
lazy import Pandas처럼lazy를 붙여 import를 선언하면 의존성은 모듈 상단에 계속 보인다. - 지연 실행: Python은 선언 즉시 모듈을 불러오지 않고 코드가 그 모듈을 처음 사용할 때 실제 import를 수행한다.
- 새 키워드:
-
가시성과 지연의 결합
- 코드 읽기: 개발자는 파일 위쪽에서 필요한 모듈을 한눈에 볼 수 있다.
- 실행 비용: 호출되지 않는 기능의 무거운 의존성은 해당 실행에서 로드되지 않아 startup 비용을 줄일 수 있다.
1.3. lazy import를 기본값으로 만들 때의 트레이드오프
-
오류 발생 시점의 이동
- import error: 모듈을 읽는 시점에 발생하던 import 오류가 해당 모듈을 처음 사용할 때 발생한다.
- side effect: import 과정에서 실행되는 부수 효과도 애플리케이션 시작 시점이 아니라 첫 사용 시점으로 이동한다.
-
적용 판단
- 선택적 사용: 모든 import를 무조건 lazy로 바꾸기보다 시작 시간과 오류 발견 시점의 교환관계를 기준으로 선택해야 한다.
- 새로운 가능성: 종전에는 함수 안으로 import를 옮겨야 했던 상황에서, 선언을 정리한 채 지연 로딩을 적용할 수 있다.
2. frozen dict로 불변 매핑과 해시 가능한 설정을 만든다
Python 3.15는 언어에 직접 내장된 읽기 전용 매핑인 frozen dict를 추가한다.
2.1. 딕셔너리에도 불변 자료구조가 필요했던 이유
-
기존 불변 자료구조와의 비대칭
- 리스트와 튜플: 튜플은 리스트의 읽기 전용 대응물처럼 사용할 수 있다.
- 셋과
frozenset: 셋에도 불변 버전이 있었지만, 딕셔너리에는 같은 역할의 내장 자료구조가 없었다.
-
내장 불변 매핑의 도입
- 언어 내장: 별도 패키지를 import하지 않고
frozen dict객체를 선언할 수 있다. - 수정 차단: 생성한 뒤 값을 편집하려 하면 type error가 발생해 설정값과 공유 상태를 보호한다.
- 언어 내장: 별도 패키지를 import하지 않고
2.2. 해시 가능성과 실무 활용
-
해시 가능한 조건
- 키와 값의 조건: 키와 값이 모두 hashable이면
frozen dict자체도 hashable이 된다. - 불변성의 효과: 내용이 바뀌지 않는다는 전제가 있으므로 딕셔너리의 키로 사용할 수 있다.
- 키와 값의 조건: 키와 값이 모두 hashable이면
-
활용 지점
- cache key: 계산 결과를 식별하는 캐시 키로 불변 설정 묶음을 사용할 수 있다.
- configuration key: 설정 조합을 다른 딕셔너리의 키로 사용해 구성별 값을 저장할 수 있다.
2.3. dict 상속 여부와 타입 검사
-
구체 타입과 매핑 동작의 구분
dict의 서브클래스가 아님:frozen dict는 일반dict의 서브클래스가 아니므로isinstance검사에서 두 타입을 동일하게 취급할 수 없다.- 동작 기준 검사: 코드가 필요한 것이 구체적인 딕셔너리 컨테이너가 아니라 매핑 동작이라면 더 일반적인 타입을 사용해야 한다.
-
collections.abc의Mapping- 추상 인터페이스:
collections.abc에서Mapping타입을 가져오면 딕셔너리인지 여부가 아니라 매핑인지 여부를 검사할 수 있다. - 호환성 있는 API: 일반 딕셔너리와
frozen dict를 모두 받는 함수는 구체 타입 대신 매핑 인터페이스를 요구할 수 있다.
- 추상 인터페이스:
3. 표준 sentinel로 값이 제공되지 않은 상태를 표현한다
Python 3.15는 선택적 인자에서 “값이 전달되지 않음”을 나타내는 센티널(sentinel)을 표준 방식으로 만든다.
3.1. None과 임시 object() 센티널의 한계
-
None만으로 구분할 수 없는 API- 실제 값과 미제공의 구분:
None이 유효한 입력값일 수 있으면,None을 인자가 빠졌다는 뜻으로 동시에 사용할 수 없다. - 별도 표식의 필요: “인자가 제공되지 않았다”와 “인자가
None으로 제공됐다”를 구분하려면 고유한 객체가 필요하다.
- 실제 값과 미제공의 구분:
-
관례적인
object()패턴- 임시 객체 생성: 기존에는
missing = object()처럼 객체를 만들고 그 객체의 identity를 미제공 상태의 표식으로 사용했다. - 표현력 부족: 일반
object는 센티널 전용 타입이 아니며 불필요한 부가 정보가 있고, 읽기 쉬운 표시(representation)를 제공하지 않는다.
- 임시 객체 생성: 기존에는
3.2. 표준 센티널의 특성
-
읽기와 identity 보존
- 유용한 representation: 표준
sentinel은 어떤 상태를 나타내는지 사람이 읽을 수 있는 표현을 제공한다. - 복사 후 identity 유지: 복사하더라도 동일한 센티널이라는 identity가 보존된다.
- 유용한 representation: 표준
-
직렬화와 타입 표현
- pickling 지원: 모듈 스코프에서 올바르게 정의하면 pickle을 지원해 프로세스 경계를 넘는 처리에도 사용할 수 있다.
- type expression 지원: 타입 표현식에서 사용할 수 있어 API가 “값이 공급되지 않음”을 더 표준적이고 읽기 좋게 설명한다.
3.3. 비교 규칙
- identity 비교
is사용: 센티널 비교는==가 아니라is키워드로 수행해야 한다.- 동일 객체라는 의미: 센티널은 값의 동등성보다 특정 표식 객체 그 자체가 전달됐는지가 의미이므로 identity 비교가 의도에 맞다.
4. 컴프리헨션 내부 언패킹으로 중첩 자료구조를 짧게 평탄화한다
Python 3.15는 컴프리헨션(comprehension) 안에서 언패킹(unpacking)을 허용해 중첩 리스트와 딕셔너리를 더 짧게 합친다.
4.1. 리스트 평탄화
-
중첩 리스트의 일반적인 문제
- 입력 형태: 리스트 안에 여러 리스트가 들어 있는
list of lists를 하나의 리스트로 만들 때 기존에는 중첩 반복문을 작성해야 했다. - 표현 길이: 이 방식은 동작하지만 단순히 각 내부 항목을 펼치는 목적에 비해 코드가 길어진다.
- 입력 형태: 리스트 안에 여러 리스트가 들어 있는
-
컴프리헨션 언패킹
- 직접 평탄화: 새 문법은 내부 리스트의 항목을 컴프리헨션 결과에 직접 펼쳐 넣는다.
- 작은 문법 개선: 단순한 기능이지만 반복문을 줄이고 자료 변환의 의도를 한 줄에 보여준다.
4.2. 딕셔너리 언패킹과 도구 지원
-
리스트 외 적용 범위
- 딕셔너리: 같은 종류의 언패킹을 딕셔너리 컴프리헨션에도 적용해 여러 매핑을 합칠 수 있다.
- 자료구조별 표현: 리스트에는 항목을, 딕셔너리에는 키-값 쌍을 펼치는 방식으로 자료구조에 맞는 결과를 만든다.
-
Pylance의 시점 차이
- 정적 분석 경고: 현재 Pylance는 이 문법을 아직 불가능한 것으로 판단해 경고할 수 있다.
- 실행 결과: Python 3.15 인터프리터에서는 해당 코드는 실제로 동작하므로, 도구의 문법 지원이 런타임보다 늦게 따라오는 과도기가 생길 수 있다.
5. profiling 패키지와 Tachyon으로 낮은 오버헤드 프로파일링을 수행한다
Python 3.15는 내장 프로파일링 도구를 profiling 패키지 아래에 정리하고, 샘플링 방식의 새 도구 profiling.sampling(Tachyon)을 제공한다.
5.1. 결정적 추적과 샘플링의 차이
-
profiling.tracing과 기존 호환성- 새 위치: 결정적 코드 추적(deterministic code tracing)은
profiling.tracing이 새로운 본거지가 된다. CProfile유지: 기존 코드와의 호환성을 위해CProfile도 계속 사용할 수 있다.
- 새 위치: 결정적 코드 추적(deterministic code tracing)은
-
호출 기록의 비용
- 기본 프로파일러: 일반적인 프로파일러는 함수 호출과 반환을 모두 기록해 세밀한 정보를 얻지만 모든 호출에 작업을 추가한다.
- 반복 호출의 부담: 같은 연산이 매우 많이 반복되는 프로그램에서는 호출마다 추적하는 비용이 측정 대상 자체에 영향을 줄 수 있다.
5.2. profiling.sampling(Tachyon)의 방식
-
주기적 스택 샘플링
- 샘플 수집: Tachyon은 모든 호출과 반환을 기록하지 않고 주기적으로 stack trace를 캡처한다.
- 낮은 오버헤드: 호출마다 작업을 삽입하지 않으므로 실행에 미치는 부담을 낮춘 채 병목의 전반적인 분포를 볼 수 있다.
-
실행 중인 프로세스 관찰
- 스크립트 프로파일링: 새 도구는 직접 실행하는 스크립트의 CPU 동작을 샘플링할 수 있다.
- 프로세스 attach: 이미 실행 중인 Python 프로세스에 프로세스 단위로 연결해 관찰할 수도 있다.
5.3. 실제 결과와 권한 요구사항
-
소수의 샘플로 충분한 반복 작업 분석
- 소수 계산 예시: 반복적으로 소수를 세는 간단한 스크립트를 여러 번 호출하는 상황에서 Tachyon을 사용한다.
- 49 samples: macOS에서 실행한 결과는 모든 호출을 추적하지 않고 49개의 샘플을 캡처했지만, 한 연산이 반복되는 경우 병목을 파악하기에 충분히 유용하다.
-
운영 도구로서의 범위
- 다양한 샘플링: CPU 중심 샘플링 외에도 예외(exception)에 초점을 맞추는 방식과 여러 형태의 출력 정보를 지원한다.
- OS 권한: 샘플링은 운영체제 권한이 필요할 수 있으며, macOS 예시에서는
sudo로 실행해야 했다. - 상시 추적과 구분: 올바른 OS 권한을 요구하므로 매 실행마다 쓰는 기본 도구라기보다 필요할 때 사용하는 observability 도구에 가깝다.
6. 텍스트 IO의 기본 인코딩을 UTF-8로 통일한다
Python 3.15는 인코딩을 지정하지 않은 텍스트 IO에서 시스템 locale과 독립적으로 UTF-8을 기본값으로 사용한다.
6.1. 플랫폼별 동작 차이 제거
-
기존 기본 인코딩의 문제
- locale 의존성: Python 3.15 이전에는 파일을 쓰고 다시 읽는 코드에서
encoding을 생략하면 시스템 locale이 기본 인코딩을 결정했다. - 머신별 결과: 같은 Python 코드가 서로 다른 운영체제나 머신에서 다른 방식으로 동작할 수 있었다.
- locale 의존성: Python 3.15 이전에는 파일을 쓰고 다시 읽는 코드에서
-
UTF-8 기본값의 효과
- 일관된 텍스트 처리: 인코딩을 생략한 일반 텍스트 IO가 UTF-8을 기준으로 동작해 환경별 차이가 줄어든다.
- 이식성 향상: 다른 종류의 머신에서 스크립트를 실행할 때 만나는 플랫폼 특화 문제를 한 가지 더 제거한다.
6.2. 명시적 인코딩을 유지해야 하는 경우
-
파일 형식의 계약 기록
- 형식이 인코딩을 정의하는 경우:
data.txt가 특정 인코딩을 요구한다면 코드에서 그 인코딩을 명시해야 한다. - 문서화 역할:
with open호출에 UTF-8을 직접 적으면 파일 형식에 대한 가정이 코드에 남는다.
- 형식이 인코딩을 정의하는 경우:
-
명시성이 우선하는 원칙
- 암묵적 기본값의 편리함: 일반 텍스트 파일에서는 새 기본값 덕분에 간단한 코드가 더 이식성 있게 동작한다.
- 명시적 선언의 장점: 중요한 파일 포맷에서는 기본값에 의존하지 않고 인코딩을 적는 편이 의도를 더 정확하게 전달한다.
7. TypedDict 추가 항목과 TypeForm으로 타입 표현력을 넓힌다
Python 3.15의 typing 개선은 API 응답처럼 알려진 필드와 동적으로 추가되는 필드를 함께 다루는 코드와 타입 표현을 받는 라이브러리에 특히 유용하다.
7.1. TypedDict의 extra items
-
고정 필드와 추가 필드의 결합
- API 응답 예시: 응답에는 정수형
status필드가 반드시 있고, 그 밖의 추가 항목은 문자열이라는 모델을 만들 수 있다. - 실제 데이터 형태 반영: 모든 키를 미리 나열할 수 없는 응답에서도 추가 키의 값 타입을 포기하지 않는다.
- API 응답 예시: 응답에는 정수형
-
타입 검사 결과
- 허용되는 추가 값:
status와 문자열 추가 항목을 함께 넣으면 선언한TypedDict규칙에 맞는다. - 잘못된 값 차단: 추가 항목에 Boolean 값을 넣으면 추가 항목은 문자열이어야 한다는 type issue가 발생한다.
- 허용되는 추가 값:
7.2. TypeForm의 목적
-
타입 표현식을 받는 API
- 라이브러리 중심 기능:
TypeForm은 일반 애플리케이션 개발자보다 라이브러리 작성자에게 주로 필요하다. - 입력 예시:
list[int],str | None같은 type expression 자체를 API 인자로 받을 수 있다.
- 라이브러리 중심 기능:
-
정밀해지는 라이브러리 계약
- validation: 검증 라이브러리가 어떤 타입 표현을 입력으로 받는지 정확히 기술할 수 있다.
- serialization과 dependency injection: 직렬화 및 의존성 주입 라이브러리도 타입 표현을 받는 API의 계약을 더 정밀하게 설명할 수 있다.
8. JIT와 free-threading의 실행 기반을 확장한다
Python 3.15는 실험적 JIT를 실제 실행 경로에 더 가깝게 최적화하고, GIL 없는 free-threaded C extension을 위한 기반도 진전시킨다.
8.1. 개선된 실험적 JIT
-
새 tracing front end
- 실제 경로 추적: JIT는 프로그램이 실제로 실행하는 경로를 따라가며 코드를 분석한다.
- 더 넓은 Python 코드: 과거보다 더 많은 일반적인 Python 코드가 최적화 대상이 될 수 있다.
-
최적화 구성요소
- 연산 이해: JIT가 이해하는 연산의 범위가 넓어졌다.
- register allocation과 추가 최적화: 기본적인 레지스터 할당과 후속 최적화가 추가됐다.
8.2. 성능 수치를 일반화하면 안 되는 이유
-
워크로드 의존성
- 프로그램별 차이: JIT 변경으로 얻는 속도 향상은 워크로드에 따라 크게 달라진다.
- 빌드 설정의 영향: Python 빌드 설정도 결과에 큰 영향을 주므로 “Python이 항상 10% 빨라진다”처럼 해석할 수 없다.
-
현실적인 기대치
- 가능한 최적화 범위의 확대: 고정된 성능 보장보다 평범한 Python 코드까지 최적화할 가능성이 커졌다는 점이 핵심이다.
- 측정 필요성: 실제 프로젝트는 자신의 대표 workload와 빌드 설정으로 직접 벤치마크해야 한다.
8.3. free-threading과 ABI3T
-
확장 모듈 제작자에게 직접적인 변화
- 주요 대상: free-threading 개선은 일반 애플리케이션 사용자보다 C extension 작성자가 먼저 체감한다.
- GIL 없는 Python: 확장 모듈이 GIL 없는 Python을 지원하는 장벽을 낮추는 방향으로 진행된다.
-
새 안정 ABI 목표
ABI3T: free-threaded C extensions를 위한 새로운 stable ABI target이 추가된다.- 생태계 의미: 확장 모듈이 free-threaded 환경을 지원할 때 사용할 수 있는 안정적인 호환성 목표가 생긴다.
9. 작은 개선이 누적되어 개발 경험을 다듬는다
여덟 가지 주요 변화 외에도 오류 메시지와 런타임 관측을 개선하는 작은 변경이 포함된다.
9.1. 더 유용한 오류 메시지
- 교차 언어에서 흔한 실수 보완
- 오타와 문법 혼동: 다른 언어의 습관을 Python 코드에 잘못 적용하는 흔한 실수에 대해 더 도움이 되는 오류 메시지를 제공한다.
- 수정 방향 제시: 단순히 실패를 알리는 것보다 무엇이 잘못되었는지 이해하기 쉬운 진단을 목표로 한다.
9.2. 기본 frame pointer와 도구의 품질
-
지원 플랫폼의 기본 설정
- frame pointer 활성화: CPython은 지원되는 플랫폼에서 frame pointer를 기본으로 활성화한다.
- 도구와의 연결: 프로파일링과 디버깅 도구가 실행 흐름을 분석할 때 활용할 기반 정보가 좋아진다.
-
운영 단계의 효과
- crash 분석: 충돌을 분석할 때 호출 프레임을 더 잘 추적할 수 있다.
- 작은 변화의 가치: JIT나 free-threading처럼 큰 이름의 기능은 아니지만 프로파일링·디버깅·crash 분석의 마찰을 줄인다.
부가 안내: Software Design Mastery 프로그램
Software Design Mastery 프로그램은 Python 문법을 넘어 유지보수 가능한 소프트웨어를 설계하는 내용을 다룬다.
-
다루는 범위
- 핵심 설계 원칙: 코어 설계 원칙과 코드 구조화를 다룬다.
- 시스템 아키텍처: 시스템 아키텍처와 고급 설계 트레이드오프를 포함한다.
-
AI 코딩 보조 도구와 설계
- 변화하는 설계 방식: AI coding assistant가 소프트웨어 설계 방식을 어떻게 바꾸는지 다룬다.
- 안내 링크: 자세한 내용은
iron.io/mastery에서 확인할 수 있으며, 링크는 설명란에도 제공된다.
주요 발언 모음
“I’m a simple man. I like simple things.”
작은 개선을 좋아하며, 단순한 기능도 실무에서는 가치가 있다는 태도를 보여준다.
“Explicit is still better than implicit.”
UTF-8이 기본값이 되어도 파일 형식의 가정은 코드에 명시하는 편이 낫다는 원칙을 강조한다.
“Don’t translate this into Python is always 10% faster or something like that.”
JIT 개선을 고정된 속도 향상률로 일반화하지 말고 실제 workload로 측정해야 한다는 뜻이다.
“Nothing groundbreaking, but nice.”
Python 3.15를 혁명적 변화보다 여러 작은 개선이 쌓인 좋은 버전으로 평가한다.
핵심 데이터 & 수치
- 원본 영상 발행일: 2026-10-02이며 처리일은 2026-10-03이다.
- 재생 시간: 12분 48초다.
- 샘플링 프로파일러 결과: 반복 소수 계산 스크립트에서 49개 샘플을 캡처했다.
profiling구성: 결정적 추적은profiling.tracing, 샘플링은profiling.sampling(Tachyon)으로 정리된다.- 호환성: 기존
CProfile은 호환성을 위해 계속 이용할 수 있다. - 인코딩: 지정하지 않은 텍스트 IO의 기본 인코딩이 시스템 locale과 독립적인 UTF-8이 된다.
- free-threading: GIL 없는 C extension을 위한 새 stable ABI target 이름은
ABI3T다. - 운영체제 권한: macOS에서 sampling profiler를 사용할 때
sudo가 필요할 수 있다.
결론 및 시사점
- 대형 애플리케이션은 import를 무작정 함수 안으로 옮기기 전에
lazy import로 의존성 가시성을 유지할 수 있지만, 오류와 side effect가 첫 사용 시점으로 이동하는 점을 함께 검토해야 한다. - 설정과 캐시 식별자를 변경 불가능하게 만들고 싶다면
frozen dict의 hashability를 활용하되, 함수 타입 검사는dict보다collections.abc.Mapping같은 동작 중심 인터페이스를 기준으로 설계해야 한다. - 선택적 인자에서
None과 미제공을 구분해야 하는 API는 임시object()보다 표준sentinel을 사용하고 비교는is로 수행하는 편이 명확하다. - 컴프리헨션 언패킹은 중첩 리스트와 딕셔너리를 짧게 합치지만, Pylance 같은 정적 분석 도구가 새 문법을 따라오는지 확인해야 한다.
- 반복 작업의 병목을 낮은 오버헤드로 찾을 때는 모든 호출을 추적하는 프로파일러와 Tachyon 샘플링의 목적을 구분하고, 운영체제 권한을 준비해야 한다.
- UTF-8 기본값은 머신 간 차이를 줄이지만 파일 형식이 정한 인코딩은 여전히 명시적으로 기록해야 한다.
TypedDict의 extra items와TypeForm은 동적 API 응답과 타입 표현식을 다루는 라이브러리의 계약을 더 정밀하게 만든다.- JIT와 free-threading은 모든 프로그램의 고정된 성능 향상을 약속하는 기능이 아니며, 실제 workload·빌드·확장 모듈 생태계를 기준으로 평가해야 한다.
핵심 요약 (20줄)
Python 3.15는 하나의 혁명보다 여러 실무 개선을 묶어 제공한다.
lazy import는 모듈 선언을 상단에 남기면서 실제 로딩을 첫 사용까지 미룬다.
대형 애플리케이션은 사용하지 않는 무거운 의존성을 startup phase에 로드하지 않을 수 있다.
지연 import를 쓰면 import error와 side effect가 애플리케이션 시작이 아니라 첫 사용 때 발생한다.
frozen dict는 Python에 내장된 읽기 전용 매핑으로 딕셔너리의 불변 버전을 제공한다.
키와 값이 hashable이면 frozen dict도 hashable이 되어 cache key나 configuration key로 쓸 수 있다.
frozen dict는 dict의 서브클래스가 아니므로 일반화된 매핑 검사는 collections.abc.Mapping이 적합하다.
표준 sentinel은 인자가 제공되지 않았다는 상태를 None과 구분해 표현한다.
센티널은 복사 뒤에도 identity를 보존하고 올바른 모듈 스코프 정의에서 pickling을 지원한다.
센티널 비교는 값의 동등성보다 객체 identity가 중요하므로 is를 사용한다.
컴프리헨션 언패킹은 중첩 리스트를 짧게 평탄화하고 딕셔너리에도 적용할 수 있다.
Pylance가 새 언패킹 문법을 경고해도 Python 3.15 인터프리터에서는 코드가 동작할 수 있다.
profiling.sampling인 Tachyon은 호출마다 기록하지 않고 주기적으로 stack trace를 수집한다.
Tachyon은 반복 소수 계산 예시에서 49개 샘플을 캡처했고 실행 중 프로세스에도 연결할 수 있다.
Python 3.15의 텍스트 IO 기본 인코딩은 시스템 locale과 독립적인 UTF-8이다.
파일 형식의 인코딩 계약은 기본값에 맡기지 말고 코드에 명시하는 편이 낫다.
TypedDict는 알려진 필드와 타입이 정해진 extra items를 함께 표현할 수 있다.
TypeForm은 validation·serialization·dependency injection 라이브러리가 타입 표현식을 받는 계약을 설명한다.
JIT는 tracing front end와 register allocation을 얻지만 속도 향상률은 workload와 빌드 설정에 따라 달라진다.
ABI3T, 더 나은 오류 메시지, 기본 frame pointer는 free-threading·디버깅·crash 분석의 기반을 다듬는다.
