[Python] str.format()

파이썬에선 기본적으로 C 스타일의 문자열 포맷 방법을 제공한다. printf나 sprintf 처럼 % 문자를 사용해서 문자열을 대체하는 것 말이다. 우연찮은 기회에 이 방법이 아닌 다른 방법으로 문자열을 포매팅 하는 방법(str.format)을 알게 되어서 이에 대해 가장 기본적인 사항을 포스팅을 해 본다.

우선 이 기능은 Python 2.6 부터 동작하며 일부는 2.7에서 추가된 기능도 있을 수 있다.

이름이 str.format인데 str은 파이썬의 기본 문자열 자료구조이기 때문에 별도의 import 과정은 필요 없다. 아래는 예제이다.
>>> '{0} {1} {2}'.format('a', 'b', 'c')
'a b c'
>>> 'My name is {0}. I live in {1}'.format('Seorenn', 'Korea')
'My name is Seorenn. I live in Korea'
단순명쾌하다. 중괄호 {} 에 감싸진 내부의 숫자 순서대로 format을 통해 넘겨진 문자열로 대체되는 방식이다. %를 사용하는 문법과 비교되는 짝이 맞는 표현이라서 가독성이 좋을 거라고 생각된다.

다만 좀 귀찮은 점이 있다. 이 숫자는 순서가 아니라 튜플의 인덱스(index)이다.
>>> '{1} {2} {3}'.format('a', 'b', 'c')
Traceback (most recent call last):
  File "", line 1, in 
IndexError: tuple index out of range
위 예제는 Out of range 예외가 발생한다. format으로 넘긴 인자는 3개이며 순서대로 0, 1, 2 인덱스가 붙게 되는데 치환 시에는 1, 2, 3을 사용하기 때문에 존재하지 않는 3에서 오류가 발생하는 것이다.

그렇다면 이런 식으로도 쓸 수 있다는 말이 된다.
>>> '{1} {2} {3}'.format('a', 'b', 'c', 'd')
'b c d'
예상대로 0번에 해당하는 'a'는 사용되지 않는다.

그런데 이렇게 인덱스를 넘기는 것은 좀 귀찮다. 그래서 아래와 같은 문법도 제공된다.
>>> '{} {} {}'.format('a', 'b', 'c', 'd', 'e')
'a b c'
좀 더 편하게 이용이 가능하다. 하지만 이 방식은 2.7 부터 제공되기 때문에 일부 서버군에 배포되는 구버전 Python 에서는 무리가 있겠다.

그런데 좀 아쉽게 생각되는 것이 있다. % 문법에서는 타입 문자 대신 이름 키워드와 사전(dict)를 넘겨서 좀 더 가독성이 좋게 표현하는 방법이 있는데 그에 비해서는 그다지 가독성이 좋지는 못 하다. 그런데 걱정 할 필요는 없다. 이미 비슷한 기능이 제공되고 있으니까. :-)
>>> 'My name is {name}. I live in {country}'.format(name='Seorenn', country='Korea')
'My name is Seorenn. I live in Korea'
가독성이 매우 좋아졌다. %에 비해 짝이 맞는 표현에다가 가독성도 높아졌다.

단순한 문자열 포매팅을 위해서 위 방법만을 알아둬도 써 먹을 데가 제법 있을 것 같다.

이 외에도 다른 문법의 독특한 기능이 제공된다. (공식 문서에서도 아예  mini language 라고 표기할 정도로 문법이 다채롭다) 아래는 그 예 중 하나이다.
>>> import datetime
>>> 'Today is {:%Y-%m-%d}.'.format(datetime.datetime.now())
'Today is 2012-12-04.'
중괄호 내에 표기된 내용은 datetime의 strftime 형식과 일치한다. 정말 독특하다.

이 외에도 좀 더 복잡하게 nested list를 이용한다던가 형식을 바꾼다던가 등등 Python 특유의 자료구조를 이용한다면 상상 할 수 있는 다양한 기능이 제공된다. 아래 링크에서 좀 더 자세한 내용을 확인 할 수 있다. 빠르게 이해하려면 7.1.3.2 Format examples 항목만을 봐도 된다.

댓글

이 블로그의 인기 게시물

버전(Version)을 제대로 이해하기

소수점 제거 함수 삼총사 ceil(), floor(), round()