Python 문자열 리터럴의 예상 밖 구문 규칙

4 days ago 10
  • 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-string
f'{'}'}'
  • f-string 표현식에는 따옴표뿐 아니라 여러 줄과 주석도 들어갈 수 있음
f'{67#}' }'''
  • 중괄호 안을 해석하려면 전체 Python 파서를 호출해야 하며, 표현식은 괄호 밖이면서 주석 안이 아닌 }, !, :에서 종료됨
  • :도 종료 문자로 쓰이므로 lambda와 할당 표현식은 f-string 안에서 괄호가 필요함
f'{lambda: 67}' # syntax error f'{x := 67}' # 사실상 f'{x}'와 같음
Read Entire Article