ㅍㅍㅋㄷ

python 3에서는 f-string이 갑이다. 본문

Programming/Python

python 3에서는 f-string이 갑이다.

클쏭 2019. 5. 12. 00:43

 

f-string 사용 방법과 사용해야 하는 이유

Python 에서 문자열을 다룰 때는 여러가지 방식으로 사용할 수 있다.

대부분은 아마도 기존 python 2에서 지원하던 %-formatting 방식과 Format string syntax 인 str.format() 메서드 방식을 주로 사용할 것이다.

 

하지만, 이 방식들은 모두 아쉬운 점이 있는데, 가장 큰 문제로 지적되는 것이 바로 가독성 문제이다.

아래 예를 보자.

name = 'song'
sex = 'male'
married = 'married'
language = 'python'
job = 's/w engineer'
 
'Hi, I am %s. I am %s and I like to use %s. I am %s and I was %s. Nice to meet you.' % (name, job, language, sex, married)
>>> 'Hi, I am song. I am s/w engineer and I like to use python. I am male and I was married. Nice to meet you.'

위에서 보면 알수 있듯이, 변수가 많아질수록 % 가 늘어나면서 문자열이 복잡해 지는 것을 볼 수 있다.

코드의 가독성이 현저히 떨어 지고 있는 것이 느껴질 것이다.

 

str.format() 을 사용해도 복잡한 상황이 별반 다르지 않다.

'Hi, I am {}, I am {} and I like to use {}. I am {} and I was {}. Nice to meet you.'.format(name, job, language, sex, married)
>>> 'Hi, I am song, I am s/w engineer and I like to use python. I am male and I was married. Nice to meet you.'

 

이를 해결하기 위해서 Python 신규 버전(3.6 이상) 부터는 Literal String Interpolation 이라는,

간단히 줄여서 f-string 이라고 불리는 새로운 기능을 제공해 준다. 

 

먼저 간단한 사용법 부터 보자. f-string 은 아래와 같이 'f' 라는 접두사를 통해 간단하게 사용 가능하다. 

name = 'Song'
sex = 'male'

f'Hi, I am {name}. I am {sex}.'
>>> 'Hi, I am song. I am male.'

 f-string 은 대문자 'F' 로도 사용 가능하다. 하지만, 기본적으로 소문자 f를 사용하는게 PEP의 기본 가이드이기 때문에 이를 따르는게 좋다.

F'Hi, I am {name}. I am {sex}.'
>>> 'Hi, I am song. I am male.'

 

f-string를 사용한 문자열에는 중괄호 {} 를 이용해서 다양한 표현식을 사용할 수 있다.

python진영에서 많이 사용되어 오던 Jinja Template 과 비슷한 사용법 때문에 어렵지 않게 사용 가능하다. 

 

표현하고자 하는 내용이 복잡해 질수록 더욱 빛을 발하게 된다.

f'Hi, I am {name}, I am {job} and I like to use {language}. I am {sex} and I was {married}. Nice to meet you.'
>>> 'Hi, I am song, I am s/w engineer and I like to use python. I am male and I was married. Nice to meet you.'

위의 %-formatting 이나 str.format() 방식보다 훨씬 직관적이다.

 

그리고 f-string은 다양한 방식으로도 사용 가능하다.

아래는 f-string을 사용하여 변수에 수식을 더해서 사용했을 때의 표현 방법이다.

x = 10
y = 3

f'x + y = {x+y} | x * y = {x*y}'
>>> 'x + y = 13 | x * y = 30'

 매우 간단하게 표현 가능함을 볼 수 있다.

 이를 기존의 %-formatting 과 str.format() 을 사용했을때와 비교해 보자.

# Use %-formatting
'x + y = %d | x * y = %d' %(x+y, x*y)
>>> 'x + y = 13 | x * y = 30'


# Use str.format()
'x + y = {} | x * y = {}'.format(x+y, x*y)
>>> 'x + y = 13 | x * y = 30'

f-string을 사용했을때, 기존의  %-formatting 이나 str.format() 방식보다 훨씬 간결하게 표현 가능한 것을 볼 수 있다.

 

이러한 점 말고도 f-string을 사용했을때의 추가적인 장점들을 몇가지 더 살펴보자.

첫번째로, 문자열에 표현하고자하는 대상 변수의 type에 대해 자유도가 더 높다.

이해하기 쉽도록 예제를 통해 알아보자.

tuple = ('Hi, I am', 'song', 123)

위와 같은 tuple 형의 값이 있다고 가정했을때,

이를 %-formatting 을 사용해 문자열에서 표현하고자 하면 아래와 같은 에러 메시지를 볼 수 있다.

'tuple: %s' %(tuple)
>>> Traceback (most recent call last):
>>>   File "<stdin>", line 1, in <module>
>>> TypeError: not all arguments converted during string formatting

%-formatting 은 기본적으로 int, string, double 형만 지원하기 때문에 위와 같은 tuple 형은 지원하지 못한다.

이를 해결하려면 아래와 같이 string 으로 명시적으로 변환해야 하는 과정을 거쳐야 한다.

'tuple: %s' %(str(tuple))
>>> "tuple: ('Hi, I am', 'song', 123)"

 

만약 f-string을 사용한다면, 이러한 고민 없이 바로 사용 가능하다.

f'tuple: {tuple}'
>>> "tuple: ('Hi, I am', 'song', 123)"

 

또 다른 예를 보자.

아래는 날짜 변수를 이용한 예제이다.

import datetime

date = datetime.datetime.now()

f'{date:%Y-%m-%d} is on a {date:%A}'
>>> '2019-05-11 is on a Saturday'

f-string 을 이용하면, 위와 같이 간단하게 datetime 포맷 변경이 가능하다.

기존 str.format() 과 비교해 보면, f-string 이 얼마나 손쉽게 사용 가능한지 비교될 것이다.

'{} is on a {}'.format(date.strftime("%Y-%m-%d"), date.strftime("%A") )
>>> '2019-05-11 is on a Saturday'

 

참고

Comments