Real Python의 Python 3's f-Strings: An Improved String Formatting Syntax (Guide)를 번역한 글 입니다. 기본 문법 부분.
문자열 객체에는 % 연산자를 사용한 문자열 format 방식이 내장되어 있고, 예시는 아래와 같습니다.
>>> name = "다현"
>>> "Hello, %s." % name
'Hello, 다현.'
하나 이상의 변수를 넣기 위해서는 튜플 형태를 사용해야합니다.
>>> name = "다현"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello, 다현. You are 74.'
위의 코드 예시는 아마 읽을만 했을텐데, 한 번 여러 매개변수들과 긴 문자열들을 사용하기 시작하면 우리의 코드는 아주 빠르게 가독성이 떨어질 수 있습니다. 아래를 보니 벌써부터 혼란스러워지기 시작하네요.
>>> 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 방식은 장황하고 에러도 발생시키기 쉽습니다. 다행히도 우리에겐 더 좋은 방식이 기다리고 있습니다.
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() 방식이 %-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)으로 압축을 풀고 문자열에서 키로 값을 참조하면 되지만 더 좋은 방법이 있습니다.
f-Strings는 파이썬 3.6에서 도입되었습니다. "formatted string literals"라고도 불리는 f-Strings는 f로 시작하고, 소괄호 안에 값과 대체되는 표현식을 가지고 있습니다.
문법은 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.'
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!"
>>> 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'