본문 바로가기

Python에 F-string 이라는 게 있었다?

기술적인 이야기/기타 개발 2020. 2. 11.
반응형

현대적인 언어에서는 대체로 String Interpolation이라 불리우는 기능들이 있습니다. 이 기능은 문자열 내에 특정 문자열을 집어넣거나 치환시키기 위한 특수한 문법이자 기능입니다. 만약 이런 기능이 없다면 문자열 조합에 상당한 난관(?)이 있겠지요. 이번 글은 이런 기능이 파이썬에도 있다는 것을 알게 되어서 공부 겸 작성해 본 글입니다.

기존의 파이썬의 이런 비슷한 기능으로 % 사인을 이용한 printf식 포매팅이나 format()을 활용한 치환법이 있었습니다.

fs = '%d + %d = %d' % (1, 2, 3)
fmts = '{} + {} = {}'.format(1, 2, 3)

하지만 이 방법의 문제는 명확했죠. 치환될 위치와 실제로 입력될 값을 다른 위치에 입력하다 보니 결국 눈으로 하나하나 따라가면서 위치를 살펴봐야 했고 그래서 종종 위치를 잘못 넣는 등 실수를 하는 경우도 있습니다.

그런데 이 문제를 해결할 수 있는 대안으로 드디어 파이썬에 F-string이라는 기능이 도입됩니다.

F-string은 PEP-498 제안을 통해 Python 3.6 부터 지원되기 시작한 기능으로 정식 명칭은 Literal String Interpolation 입니다. 이 F-string은 앞서 살펴본 고적적인(?) 포매팅 코딩의 실수를 좀 더 방지해 줄 수 있는 현대적인 포매팅 방법을 제공합니다. 심지어 아주 새로운 것도 아니고 다른 언어들이 제공하는 것과 상당히 비슷한 방법이라 어색하지도 않게 말이지요.

반응형

F-string 문법

문자열을 표현하는 구문 앞에 f 를 붙이면 쉽게 F-string이 됩니다. 그리고 문자열 내부에서 치환할 내용은 중괄호로 {...} 형식으로 둘러 싸기만 하면 됩니다.

>>> name = 'Conrad'
>>> print(f'My name is {name}')
My name is Conrad

name이라는 변수를 {name}이라는 표기만으로 쉽게 문자열 안에 삽입하는 것을 볼 수 있습니다. 마치 ES6나 Swift의 String Interpolation과 상당히 닮은, 흔하면서 친숙한 모습입니다.

따라서 기능적으로도 상당히 비슷하다는 것을 알 수 있습니다. 예를 들어 중괄호 안의 내용으로 파이썬 구문을 그대로 사용할 수도 있습니다.

>>> f'1 + 2 = {1+2}'
'1 + 2 = 3'

이런 일반적인 수식 뿐만 아니라 함수 호출도 문제 없이 됩니다.

>>> def makeDouble(v):
...     return v * 2
...
>>> f'This is doubler! If you enter 10, it returns {makeDouble(10)}'
'This is doubler! If you enter 10, it returns 20'

다른 언어에서 비슷한 기능을 먼저 접하고 사용하고 있었기 때문에 왠지 당연해 보입니다.

약같 특수한 문법으로 아래처럼 사용하는 방법도 있습니다.

>>> value = 100
>>> f'{value=}'
'value=100'

위 문법은 self-documenting 표현식 이라는 주제로 Python 3.8부터 도입 되었습니다. 로그로 디버깅을 할 때 유용하게 사용할 수 있을 것 같습니다.

728x90

포매팅(Formatting)

요즘 세상에 자주 쓸 일이 없겠지만, 그래도 C의 printf식 스타일의 포매팅이 간간히 쓰일 때가 있습니다. 예를 들어 년월일을 표현할 때 2019-1-5 보다는 2019-01-05 라는 식으로 자리수를 정확히 표현해 주는 것이 좋을 때도 있습니다.

F-string도 이런 방식의 포매팅을 여전히 지원합니다. 예를 들어

>>> value = 12
>>> f'the value is {value}'
'the value is 12'

위 코드에서 12를 네자리 수로 표현하고 싶다면 아래처럼 할 수 있습니다.

>>> f'the value is {value:#04d}'
'the value is 0012'

여기서 :# 으로 시작하는 특수 문법이 등장합니다. 그리고 그 뒤에는 04d 라는 것이 적혀있는데, 이는 4자리수의 정수(decimal)를 표현하되 앞 자리의 남는 공간에는 0을 채우라는 의미의 포매팅 문법입니다. C 식 포매팅 문법인 %04d과 굉장히 흡사합니다.

16진수로 표현할 수도 있을까요? x를 사용하면 16진수 출력도 가능합니다.

>>> f'the value is {value:#02x}'
'the value is 0xc'
>>> f'the value is {value:#02X}'
'the value is 0XC'

대소문자 차이를 잘 살펴봅시다. X가 대문자이면 치환되는 문자 역시 대문자 16진수로 표기됩니다.

실수의 자릿수를 제한하는 문법도 거의 동일하게 표현 가능합니다.

>>> fvalue = 123456.654321
>>> f'simple value = {fvalue:#.2f}'
'simple value = 123456.65'

#.2f는 실수의 소수점 아래를 2자리 까지만 표시하는 방식으로 printf의 %.2f와 흡사합니다. C에 익숙한 아재라면 뭐... 익숙하시겠네요. 네 저도 익숙합니다. 😏

포맷팅 문법도 자기 자신 표현식(self-documenting) 문법에서도 사용할 수 있습니다.

>>> value = 100
>>> f'{value=:#10d}'
'value=       100'

#10d는 10칸에 맞춰 우측 정렬로 정수를 채워넣는 방식의 포매팅으로 printf의 %10d와 흡사한 문법이면서도 동일한 결과를 볼 수 있습니다. 뭔가 가독성은 마음에 안 들지만 애초에 이 기능은 로그 메시지 작성을 제외하곤 많이 쓰일 것 같지는 않기도 하네요. 앞서 이야기 했지만 이 문법은 3.8부터 사용할 수 있으니 주의합시다.

주의점

F-string의 특수한 주의점으로, 중괄호 내부에서는 백슬래시(\)를 쓸 수 없다는 점이 있습니다.

>>> 'the \'back-slash\' string'
"the 'back-slash' string"
>>> f'the \'back-slash\' string'
"the 'back-slash' string"
>>> f'the {\'back-slash\'} string'
  File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash

위에서 3번째의 오류가 발생하는 예제의 경우는 상당히 표현하기 난감한 방식이긴 합니다. 굳이 쓸 이유는 잘 없겠지만, 위와 같이 표현해야 할 일이 있다면 다른 변수에 적당히 넣어서 써 봅시다. 아래 처럼 말이지요.

>>> bsstr = "'back-slash'"
>>> f'the {bsstr} string'
"the 'back-slash' string"

이상으로 Python의 F-string 문법을 살짝 살펴봤습니다. 설마 아직도 Python 2에 머물러 계신가요? Python 3에서는 이런 다양하게 편한 문법이 도임되었으니 꼭 체험하고 저처럼 마이그레이션으로 고생(?) 해보세요! 😎

728x90
반응형

댓글