파이썬3의 f-Strings : 개선된 string formatting syntax (번역)

jomminii_before·2020년 1월 29일
2

Real Python의 Python 3's f-Strings: An Improved String Formatting Syntax (Guide)를 번역한 글 입니다. 기본 문법 부분.

전통적인 String Formatting 방식

1. %-formatting

%-formatting 을 사용하는 방법

문자열 객체에는 % 연산자를 사용한 문자열 format 방식이 내장되어 있고, 예시는 아래와 같습니다.

>>> name = "다현"
>>> "Hello, %s." % name
'Hello, 다현.'

하나 이상의 변수를 넣기 위해서는 튜플 형태를 사용해야합니다.

>>> name = "다현"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello, 다현. You are 74.'

%-formatting 이 안좋은 이유

위의 코드 예시는 아마 읽을만 했을텐데, 한 번 여러 매개변수들과 긴 문자열들을 사용하기 시작하면 우리의 코드는 아주 빠르게 가독성이 떨어질 수 있습니다. 아래를 보니 벌써부터 혼란스러워지기 시작하네요.

>>> first_name = "다현"
>>> last_name = "정"
>>> age = 74
>>> profession = "가수"
>>> affiliation = "이건 뭐지"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, 다현 정. You are 74. You are a 가수. You were a member of 이건 뭐지.'

불행하게도 이런 formatting 방식은 장황하고 에러도 발생시키기 쉽습니다. 다행히도 우리에겐 더 좋은 방식이 기다리고 있습니다.

2. str.format()

str.format()을 사용하는 방법

str.format()은 %-formatting 의 개선판 입니다. str.format()과 함께 대체 필드가 중괄호로 표시됩니다.

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, 다현. You are 74.'

참조하는 변수의 인덱스를 활용할 수도 있습니다.

>>> "Hello, {1}. You are {0}.".format(age, name)
'Hello, 다현. You are 74.'

변수명을 삽입하게 되면, 객체를 전달해 괄호 사이의 매개변수와 메서드를 참조할 수 있습니다.

>>> person = {'name': '다현', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(name=person['name'], age=person['age'])
'Hello, 다현. You are 74.'

또, 딕셔너리를 활용한 깔끔한 트릭을 사용할 수도 있습니다.

>>> person = {'name': '다현', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, 다현. You are 74.'

확실히 %-formatting 보다는 업그레이드가 되었지만 아직 만족스럽진 않습니다.

str.format()이 안좋은 이유

str.format() 방식이 %-formatting 방식보다 훨씬 읽기 쉬운건 맞지만, 여전히 여러 매개변수와 길어진 문자열을 처리할 때 복잡스럽습니다. 아래를 한 번 보시죠.

>>> first_name = "다현"
>>> last_name = "정"
>>> age = 74
>>> profession = "가수"
>>> affiliation = "이건 뭐지"
>>> print(("Hello, {first_name} {last_name}. You are {age}. " + 
>>>        "You are a {profession}. You were a member of {affiliation}.") \
>>>        .format(first_name=first_name, last_name=last_name, age=age, \
>>>                profession=profession, affiliation=affiliation))
'Hello, 다현 정. You are 74. You are a 가수. You were a member of 이건 뭐지.'

딕셔너리에서 .format()으로 전달하려는 변수가 있는 경우 .format(**some_dict)으로 압축을 풀고 문자열에서 키로 값을 참조하면 되지만 더 좋은 방법이 있습니다.

3. f-Strings

f-Strings는 파이썬 3.6에서 도입되었습니다. "formatted string literals"라고도 불리는 f-Strings는 f로 시작하고, 소괄호 안에 값과 대체되는 표현식을 가지고 있습니다.

Simple 문법

문법은 str.format()과 비슷하지만 덜 장황스럽고 더 읽기 쉽습니다.

>>> name = "다현"
>>> age = 74
>>> f"Hello, {name}. You are {age}."
'Hello, 다현. You are 74.'

f는 대문자로 써도 됩니다.

>>> name = "다현"
>>> age = 74
>>> F"Hello, {name}. You are {age}."
'Hello, 다현. You are 74.'

Arbitrary Expressions(임의 표현식)

f-Strings는 실행될 때 평가되기 때문에, 파이썬에서 유효한 모든 표현식을 사용할 수 있습니다. 이러한 특성으로 쓰기 좋은 몇 가지를 할 수 있는데요.
직접적으로 말하면 아래와 같이 활용할 수도 있습니다.

>>> f"{2 * 37}"
'74'

함수를 호출할 수도 있습니다.

>>> def to_lowercase(input):
...     return input.lower()

>>> name = "다현"
>>> f"{to_lowercase(name)} is funny."
'다현 is funny.'

메서드도 바로 불러올 수 있습니다.

>>> f"{name.lower()} is funny."
'다현 is funny.'

f-Strings로 만들어진 클래스 객체를 사용할 수도 있습니다.

class Comedian:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

    def __str__(self):
        return f"{self.first_name} {self.last_name} is {self.age}."

    def __repr__(self):
        return f"{self.first_name} {self.last_name} is {self.age}. Surprise!"

여러 줄에서 f-Strings 사용하는 방법

>>> name = "Eric"
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> message = (
...     f"Hi {name}. "
...     f"You are a {profession}. "
...     f"You were in {affiliation}."
... )
>>> message
'Hi Eric. You are a comedian. You were in Monty Python.'

각 줄 앞에 f 를 꼭 입력해야하는 걸 기억해야합니다. 아래와 같은 코드는 작동하지 않아요.

>>> message = (
...     f"Hi {name}. "
...     "You are a {profession}. "
...     "You were in {affiliation}."
... )
>>> message
'Hi Eric. You are a {profession}. You were in {affiliation}.'

다른 방식으로는 \을 활용해 escaping 하는 방식이 있습니다.

>>> message = f"Hi {name}. " \
...           f"You are a {profession}. " \
...           f"You were in {affiliation}."
...
>>> message
'Hi Eric. You are a comedian. You were in Monty Python.'

다른 문법처럼 """ 을 사용하면 아래와 같이 되니 주의하세요.

>>> message = f"""
...     Hi {name}. 
...     You are a {profession}. 
...     You were in {affiliation}.
... """
...
>>> message
'\n    Hi Eric.\n    You are a comedian.\n    You were in Monty Python.\n'
profile
https://velog.io/@jomminii 로 이동했습니다.

0개의 댓글