2026년 10월 9일 공개된 파이썬 3.15.0에서는 인코딩을 적지 않은 파일 입출력이 운영체제의 언어·지역 설정과 관계없이 UTF-8로 처리된다. 또 모듈을 선언해 두고 실제로 처음 쓸 때 불러오는 지연 가져오기가 생겼다. 운영체제 설정에 따른 인코딩을 기대하던 파일 처리 코드는 호환성을 점검해야 하고, 시작할 때 모듈을 많이 불러오는 명령줄 도구는 시작 시간을 줄일 여지가 생긴다.
1. UTF-8은 기본값이지 강제값이 아니다
이 변경은 PEP 686에 따른 것으로, 인코딩을 생략한 파일 입출력뿐 아니라 표준 입출력과 파이프에도 적용된다. 인코딩을 명시한 코드는 그대로 동작한다.
대부분의 유닉스 환경은 이미 UTF-8 설정을 쓰므로 영향은 주로 윈도 사용자에게 있다. 기존 설정에 기대던 프로그램에서는 글자가 깨지거나 오류가 나고, 경우에 따라 오류 없이 데이터가 손상될 수 있다.
2. 의존 지점을 찾고 인코딩을 적는다
점검 순서는 단순하다. 먼저 기존 동작으로 되돌린 상태에서 인코딩을 생략한 지점을 경고로 찾고, 해당 코드에 필요한 인코딩을 직접 적은 뒤, 새 기본값으로 다시 시험한다. 설정 이름은 아래와 같다.
PYTHONUTF8=0 또는 -X utf8=0 UTF-8 모드 끄기
PYTHONWARNDEFAULTENCODING=1 또는 -X warn_default_encoding EncodingWarning 켜기
encoding="utf-8" / encoding="locale" 인코딩 명시운영체제 설정의 인코딩이 꼭 필요한 파일에는 encoding="locale"을 적는다. 이 값은 UTF-8 모드가 켜져 있어도 기존 설정의 인코딩을 쓴다.
3. 선언은 위에 두고 로딩은 첫 사용까지 미룬다
PEP 810의 lazy는 가져오기 구문 앞에서만 특별한 의미를 갖는 soft keyword다. lazy를 붙인 가져오기는 이름에 가벼운 대리 객체만 연결하고, 그 이름을 처음 쓰는 순간 실제 모듈을 불러온다.
기존에는 무거운 모듈을 늦게 불러오려고 가져오기 구문을 함수 안으로 옮기는 방법을 흔히 썼다. 새 방식은 가져오기 선언을 파일 위쪽에 모아 둔 채로 쓰지 않는 모듈의 로딩만 건너뛴다. 이 기능은 모듈 최상위에서만 쓸 수 있고, 함수나 예외 처리 블록 안에서 쓰면 문법 오류가 난다.
4. 이익과 비용이 함께 옮겨간다
이전 버전도 지원해야 하는 라이브러리는 lazy 대신 모듈 이름 목록을 선언하는 방식을 쓸 수 있다. 3.15에서는 목록에 있는 모듈만 지연되고, 이전 버전에서는 선언이 무시돼 평소처럼 즉시 불러온다.
__lazy_modules__ = ["json", "pathlib"]
import json # lazy
import os # still eager지연 가능한 최상위 가져오기를 한꺼번에 지연 대상으로 삼는 실행 옵션도 있지만, PEP 810은 라이브러리 개발자에게 이 전역 제어를 권하지 않는다. 지연은 쓰지 않는 모듈이 많을수록 시작 비용을 줄일 여지가 크다. 반면 실제로 쓰는 모듈의 로딩 비용과 로딩 오류, 플러그인 등록 같은 초기화 작업은 첫 사용 시점으로 옮겨간다. 가져오는 순간의 부수 효과에 기대는 코드는 명시적 초기화 함수로 바꾸는 편이 안전하다.
UTF-8 기본값은 기존 인코딩 의존성을, 지연 가져오기는 초기화 시점을 다시 점검할 계기다.
