1P by GN⁺ 11시간전 | ★ favorite | 댓글 1개
  • fstrings.wtf는 Python의 f-string 기능에 대한 이해도를 점검하기 위한 온라인 퀴즈
  • 최신 Python 3.13 버전에서 적용되는 f-string의 다양한 동작과 예외 사항을 테스트하는 질문으로 구성됨
  • 사용자는 별도의 과정 없이 즉시 퀴즈를 진행할 수 있음
  • 실무에서 자주 접하는 f-string 관련 트릭이나 오동작을 미리 경험해 볼 수 있음
Hacker News 의견
  • 문자열 보간 기능은 타입 추론처럼, 한 번 익숙해지면 없을 때 매우 불편함을 느낌. 점진적으로 더 추가하면 점점 더 좋아지는 듯하지만, 어느 순간 알아보기 힘든 코드가 되어버림을 깨닫게 됨. 일반적으로는 CS 분야에서 어떤 기능이든 더 추가하고 싶어하지만, 수학적으로 그게 어려울 때도 있음. 여기서는 아예 없는 것과 너무 많은 것 모두 둘 다 피해야 함. Python과 C#은 유저 취향에 맡기는 방식을 선택함. 16페이지짜리 복잡한 인터폴레이션 문자열을 쓸 수 있지만, 동료들이 싫어할 수 있으며 코드 리뷰에서 탈락할 수도 있음. C++ 23은 아예 처음부터 보간을 금지하는 스타일임. Rust는 식별자만 보간 허용하는 아주 제한적인 옵션을 선택했으며, 이게 어떤 사람들에겐 부족하고, 어떤 사람들에겐 과한 것으로 느껴질 수 있음

    • Java String Template 팀도 비슷한 과정을 겪었다고 생각함. 겉보기에 상당히 멋진 시스템이었지만, 직접 사용하려니 방향성이 불가능하다고 느껴서 결국 완전히 빼버림. 보간 기능에 대한 수요와 지금까지 투입한 노력까지 생각하면 꽤 흥미로운 결정임. 결국 되돌릴 수 없다고 판단해 원점으로 돌아간 것임

    • 순수성과 실용성은 서로 상충하며, 각 언어마다 서로 다른 균형점을 찾게 됨. 정해진 정답이 없으니 개발자마다 자신만의 올바른 기준이 있다고 반복적으로 주장하게 됨

    • C#에서 숫자나 날짜 포매팅이 필요할 때마다 문서부터 찾아보게 됨. 해당 미니 언어가 너무 별로라서 굳이 외우지 않기로 했음

    • 복잡한 예제를 맞추지 않고 보간을 적절히 컨트롤하는 게 어렵지 않았음. f-string 내부에 f-string을 중첩해서 쓸 필요성을 못 느꼈고, 자주 사용하는 포맷 지정자는 :02x 하나뿐임

    • Rust의 제한적인 보간 방식이 전혀 해결책이라고 생각하지 않음. 특정 상황에서만 동작하니, 코드 리팩토링 때 계속 신경써야 하고 불필요한 손질이 많아짐. 최소한 필드 접근 정도는 허용해야 한다고 생각함. 반면 파이썬에서는 예제처럼 이상한 경우가 있긴 해도 실사용자는 신경 안 쓰고 그냥 fstring을 즐겁게 씀

  • fstring.help 등에서 설명하는 몇 가지 팁(가운데 정렬, 0x/0b/0o 프리픽스, 아스키 표시 등)을 최근 알게 됨. 중첩 f-string 문제에도 관심이 있었는데, 3.11까지는 따옴표만 다르게 해서 가능했음. 3.12에서 여러 제약이 정리됐다고 알고 있음. f-string 덕에 편리하긴 한데, 구식 % 포매팅, .format() 방식, 새로운 방식의 미묘한 차이까지 수시로 바꿔 써야 하는 게 생각보다 번거롭고, 피할 수 없는 상황이 자주 옴. 사용성은 발전했으나 여전히 오래된 방식을 써야 할 때 아쉬움이 큼

    • 3.12에서 이런 부분이 정리된 것에 대해 공식 문서에서 확인 가능함

    • 종종 동료나 AI가 logger 호출에서 f-string을 사용하는 걸 보는데, logger는 lazy interpolation이라 일부러 그렇게 구현했을 텐데, 굳이 그 좋은 기능을 놓치는 게 의아함

    • 중첩 f-string은 트릭 같은 문제라고 생각함. 같은 스타일 따옴표로 중첩 가능한 게 추가된다는 건 알았지만, 어느 버전일지 몰랐음. 여전히 f'{f"{}"}' 트릭을 쓰고 있는데, 그 이유는 내 코드를 조금 더 오래된 파이썬 버전까지 지원하고 싶기 때문임

  • f-string에서 등호 기호(=)로 식과 값을 함께 출력하는 기능을 처음 알게 됨

    • 파이썬 릴리즈 노트는 정말 읽을 가치가 있다고 생각함. 늘 긍정적인 놀라움이 있음. 등호 기능은 Python 3.8에 추가됨 관련 링크

    • 함수 키워드 인자에서도 비슷한 기능의 PEP이 채택되지 않은 게 아쉬움. foo(bar=bar) 대신 foo(bar=) 형태라면, 단순히 인자를 넘기는 경우와 차이도 더 쉽게 드러나서 디버깅에 효율적이었을 것임

    • 놀라움을 주는 것에 비해 충분한 가치를 주지 못하는 기능이라고 생각함. 예상치 못한 동작을 할 가능성이 높아, 버그의 원천이 될까봐 걱정임. locals()의 일부만 출력해주는 표준 함수가 더 나을 듯함

    • 디버깅 출력에 엄청 자주 쓰이는 패턴임. C++에선 표현식 하나를 따옴표로, 하나는 그냥 해놓는 습관이 생겼음. 알기 쉬워지고 생각 별로 안 해도 되어서 좋음

    • print(f)로 디버깅할 때 정말 유용함

  • URL과 달리 실제로는 WTF 수준의 질문은 거의 없다고 생각함. 20, 21번 질문처럼 정말 놀라운 게 일부 있음

    • 나는 walrus operator가 너무 유용해서 절대 포기 못함. 패턴 매칭 및 다중 분기 처리할 때 코드가 훨씬 깔끔해짐. 자주 쓰지는 않지만 딱 적합한 상황에서 효과가 큼

    • 이건 walrus operator 때문이 아니라 python의 string.format 동작 방식 때문임 관련 문서 참고

  • f-string이 도입되기 전 이후로 파이썬 본격적으로 쓴 적 없지만, 문법 규칙은 거의 다 맞추었고, 오히려 값 반환 관련 실수만 몇 번 있었음. f-string 자체가 파이썬에서 제일 덜 WTF인 부분 아닐지 생각함

  • Lua용 f-string 비슷한 라이브러리 만들면서 꽤 많은 문법을 학습했지만, f"{...}"와 walrus operator는 예상 못했음. 그래도 Wat 급 이상함과는 거리가 있음. 관련 라이브러리는 여기 참고

    • 해당 라이브러리 진짜 멋져보임
  • 특별히 WTF할 만한 내용은 없다고 생각함. 상당 부분은 f-string 보다는 str.format() 미니 언어 문법에 관한 내용임

    • WTF할 만한 게 일부 있긴 했지만, 대부분은 문자열 포매팅 문법을 아는지에 관한 내용임
  • 기능이 너무 많으면서 임계점을 넘은 듯함. 한 명의 개발자가 모든 걸 숙지할 필요도 없고, 실제로 써야 할 때마다 문서를 찾아야 해서 비효율적임. 드물게 사용하다 보니 문법을 까먹고, 같은 기능을 직접 구현하는 게 훨씬 빠르며, 동료가 봐도 커스터마이즈하기 쉽다는 점이 장점임. 왼쪽 패딩? 2줄 함수면 충분함. 포매팅 문법(n이 먼저인지 <가 먼저인지 등)이 헷갈릴 바엔 ad-hoc으로 직접 구현하는 게 빠름

    • 왼쪽 패딩 같은 건 string.format 메서드에서도 사용 가능하며, 해당 방식은 Python 2.6(2008년 출시)부터 있었음 관련 문서 참고. 나는 오히려 포맷 문법이 머릿속에 잘 남아서 유용하게 씀. 게다가 포매팅은 커스터마이즈를 위한 후킹이 열려 있음

    • 나는 중간 지점을 선택하고 싶음. pad_left/pad_right 함수에 패딩 문자도 키워드 인자로 직접 지정하게 하는 게 제일 쾌적함. 일상적으로 종종 필요한 만큼 표준 라이브러리에 있으면 좋겠음. 언어 라이브러리에 이런 게 없으면 나중엔 각 프로젝트마다 퀄리티 떨어지는 구현물 천지로 변하고, 자바스크립트처럼 됨. 내 프로젝트에선 ^나 <> 같은 파이썬 포매팅까지 쓸 일은 없겠지만, '모노스페이스' 출력이 중요한 소프트웨어에선 오히려 굉장히 중요한 기능일 수 있음

    • 이상한 기능이나 편법을 한 코드베이스 안에서 반복적으로 많이 쓸 때가 있음. 한 번 만들고 복붙해서 계속 재사용하는 경우가 많음

  • 만약 이런 구문이 JavaScript였다면 대부분 직관적이지 못한 문법과 이상한 기능이라며 한탄했을 것임

    • 내 생각엔 이 퀴즈의 진짜 논지는 JavaScript 못지않게 파이썬에도 footgun이 많다는 것 같음. JS에서는 이런 'WTF' 포스팅이 자주 있어서 그런가 봄

    • 자잘한 트릭을 빼더라도, JavaScript가 압도적으로 더 직관적이지 못한 문법의 왕이라고 생각함. 파이썬의 f-string 요소도 특이하긴 한데, 특정 상황에서나 노출되고, JS에서는 배열 두 개 비교하기도 전에 의존성 설치하느라 기다려야 함

    • 자바스크립트 템플릿 리터럴 관련해서 물어보고 싶음. 파이썬처럼 let template = 'hello ${name}'; 하고, template.format({ name: 'joe' }) 식으로 여러 번 동적으로 값 채워넣는 게 JS에서는 불가능한 것 같음. 그래서 직접 구현할 수밖에 없었음. 태그드 템플릿 등도 살펴봤지만 템플릿 자체를 재사용하는 게 어려웠음. JS 문법이나 이상한 기능을 한탄하는 건 충분히 공감함

    • 만약 Perl이었다면 오히려 칭찬이 쏟아졌을 거임

  • pyformat.info(링크)를 참고하는데, 극도로 상세하지는 않아도, 대부분의 합리적인 예시는 모두 정리되어 있음