Python 문자열 리터럴의 예상 밖 구문 규칙
요약
Python의 raw 문자열 리터럴과 f-string의 구문 규칙 및 파싱 메커니즘을 설명합니다. raw 문자열의 백슬래시 처리 방식과 f-string 내 표현식 처리를 위한 파서의 동작 원리를 다룹니다.
핵심 포인트
- raw 문자열 끝에는 홀수 개의 백슬래시를 둘 수 없음
- r 접두사는 이스케이프 해석만 막을 뿐 렉싱 규칙은 유지함
- f-string 표현식 처리를 위해 전체 Python 파서가 필요함
- f-string 내 lambda나 할당 표현식 사용 시 괄호가 필요함
- Python의
raw 문자열 리터럴도 일반 문자열처럼 어휘 분석되므로 끝에 홀수 개의 백슬래시를 둘 수 없음
r'asdf\'
는 마지막 따옴표가 종료 문자로 처리되지 않아 문법 오류가 되지만, r'asdf\''
는 유효하며 문자열 내용은 asdf\'
가 됨
r
접두사는 백슬래시 이스케이프의 해석만 막을 뿐, 따옴표를 구분하는 렉싱 규칙까지 바꾸지는 않음
- f-string의 중괄호 안에는 따옴표·여러 줄·주석이 들어갈 수 있어 표현식 처리에
전체 Python 파서가 필요함 - f-string 표현식은 괄호 밖의
}
, !
, :
에서 끝나므로 lambda
와 할당 표현식을 사용하려면 괄호로 감싸야 함
Raw 문자열을 끝내는 백슬래시와 따옴표
- 다음 두 줄 중 첫 번째는
문법 오류이고 두 번째는 유효함
r'asdf\'
r'asdf\''
asdf\'
r
접두사가 있어도 raw 문자열은 일반 문자열과 같은 방식으로 어휘 분석됨
-
백슬래시 이스케이프 자체는 특별한 문자로 해석되지 않음
-
하지만 백슬래시 다음의 따옴표는 문자열 종료 문자로 취급되지 않음
-
따라서 raw 문자열 끝에는
홀수 개의 백슬래시를 둘 수 없음 -
이 규칙은 원래 구현을 단순화하기 위해 도입됨
f-string에 필요한 전체 Python 파서
f'{'}'}'
- f-string 표현식에는 따옴표뿐 아니라 여러 줄과 주석도 들어갈 수 있음
f'{67#}'
}'''
- 중괄호 안을 해석하려면 전체 Python 파서를 호출해야 하며, 표현식은 괄호 밖이면서 주석 안이 아닌
}
, !
, :
에서 종료됨
:
도 종료 문자로 쓰이므로 lambda
와 할당 표현식은 f-string 안에서 괄호가 필요함
f'{lambda: 67}' # syntax error
f'{x := 67}' # 사실상 f'{x}'와 같음
AI 자동 생성 콘텐츠
본 콘텐츠는 GeekNews의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기