f-string 안에서 같은 따옴표를 못 써서 변수를 따로 빼던 습관
문제 발생
f-string 안에서 딕셔너리를 조회하려는데 따옴표가 겹쳐 SyntaxError가 났습니다.
print(f"이름: {user["name"]}") # 3.11까지 SyntaxError그래서 바깥 따옴표를 바꾸거나, 표현식을 위로 빼서 변수에 담는 식으로 피해 갔습니다.
name = user["name"]
print(f"이름: {name}")줄바꿈으로 join하는 것도 백슬래시를 못 써서 상수를 하나 만들어야 했습니다.
NEWLINE = "\n"
print(f"목록:\n{NEWLINE.join(items)}")원인 분석
3.11까지 f-string은 일반 파이썬 파서가 아니라 별도의 규칙으로 처리됐습니다. 그래서 중괄호 안의 표현식에 제약이 붙었습니다.
- 바깥 문자열과 같은 따옴표를 쓸 수 없음
- 백슬래시를 쓸 수 없음(그래서
\n,\N{...}불가) - 여러 줄로 나눌 수 없고 주석도 달 수 없음
- 중첩 깊이에 제한
PEP 701이 3.12에서 f-string을 PEG 파서로 정식 문법으로 편입하면서 이 제약이 전부 사라졌습니다. 중괄호 안에는 이제 유효한 파이썬 표현식이면 무엇이든 들어갑니다.
부수 효과로 에러 메시지도 정확해졌습니다. 예전에는 f-string 전체를 가리키던 오류가 이제 문제가 된 표현식 위치를 짚어 줍니다.
해결 방안
- 따옴표를 그대로 재사용합니다. 우회용 임시 변수가 사라집니다.
print(f"이름: {user["name"]}")
songs = ["Eden", "Alkaline"]
print(f"재생목록: {", ".join(songs)}")- 백슬래시를 표현식 안에 직접 씁니다.
print(f"목록:\n{"\n".join(items)}")- 긴 표현식은 여러 줄로 나누고 주석을 답니다.
print(f"합계: {sum(
item.price # 세금 전 금액
for item in cart
if item.in_stock
)}")- 지원 버전을 확인합니다. 이 문법은 3.12 이상에서만 파싱됩니다. 3.11 이하를 함께 지원하는 라이브러리라면 예전 방식을 유지해야 하고, 그렇지 않으면 설치 단계에서
SyntaxError가 납니다.ruff/flake8의 target-version 설정으로 강제할 수 있습니다. - 읽기 쉬움은 별개로 판단합니다. 문법이 허용한다고 중첩을 깊게 쌓으면 읽기 어려워집니다. 제약이 사라진 덕에 없앨 수 있는 건 "우회하려고 만든 임시 변수"이지, 복잡한 표현식을 f-string 안으로 밀어넣으라는 뜻은 아닙니다.
댓글0
댓글을 남기려면 로그인이 필요해요. 로그인
아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.