파이썬 문자열 포맷 : % vs. .format()


파이썬 2.6 소개된 str.format() 함수는 % (형식 태그)를 이용하는 방식과 다소 다른 듯 합니다. 어떤 상황에 어떤 방식을 사용하는 것이 더 좋을까요?

  1. 아래 예시는 각각의 방식을 사용한 예시이며, 둘 모두 같은 결과를 보입니다. 어떤 차이가 있을까요?

    #!/usr/bin/python
    sub1 = "python string!"
    sub2 = "an arg"
    
    a = "i am a %s" % sub1
    b = "i am a {0}".format(sub1)
    
    c = "with %(kwarg)s!" % {'kwarg':sub2}
    d = "with {kwarg}!".format(kwarg=sub2)
    
    print a    # "i am a python string!"
    print b    # "i am a python string!"
    print c    # "with an arg!"
    print d    # "with an arg!"
    
  2. 또한 파이썬에서 문자열 포맷 작업은 언제 이루어지나요? 예를들어, 로깅 레벨이 HIGH로 설정되어 있으면 아래의 %가 성능에 영향을 끼치나요? 만약 그렇다면, 그를 피할 방법이 있을까요?

    log.debug("some debug info: %s" % some_info)
    
  • 2016년 05월 28일에 작성됨

조회수 161


1 답변


좋아요
0
싫어요
채택취소하기

우선, 첫번째 질문에 대해 답을 드리자면 .format은 여러 방면에서 좀더 세련되어 보입니다. %는 변수나 튜플을 받아들이는 방식에 있어서 다소 귀찮을 수 있습니다. 아래 예시가 항상 작동할 것 처럼 보이지만,

"hi there %s" % name

만약 name 변수가 (1, 2, 3)이라면, TypeError를 발생시킬 겁니다. 만약 위의 예시가 항상 작동하도록 하기 위해서는,

"hi there %s" % (name,)

과 같이 다소 지저분하게 코드를 작성해야 합니다. 반면, .format은 이러한 문제가 없습니다. 또한 올려주신 예시의 경우이도 .format이 훨씬 깔끔해 보일 겁니다.

이와 같은 방식을 사용하지 않는 경우는 아래 두 경우 중 하나일 겁니다.

  • 이와 같은 방식을 모르는 경우
  • Python 2.5와의 호환이 필요한 경우

두번째 질문에 대해 답을 드리자면, 문자열 포맷 작업은 다른 연산들을 수행할 때 동시에 이루어집니다. 그리고 파이썬은 함수를 호출하기 전에 연산을 수행합니다. 따라서 올려주신 log.debug에 관한 예시에서, "some debug info: %s" % some_info가 먼저 수행되어 이를테면, "some debug info:roflcopters are active"와 같이 변환된 뒤에 log.debug() 함수로 넘어갈 것입니다.

  • 2016년 05월 29일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close