문자열 보간 및 서식 지정을 위한 Python의 F-String

2023. 12. 8. 22:26python/basic

F-문자열의 값과 개체 보간

Python f-문자열은 보간 및 형식 문자열을 지정합니다. 읽기 쉽고 간결하며 .format() 메소드 및 모듈로 연산자(%)와 같은 기존 문자열 보간 및 서식 지정 도구보다 오류가 발생할 가능성이 적습니다. f-문자열은 갸존 도구보다 약간 더 빠릅니다!

  • f-문자열을 사용하여 문자열에 보간 값, 개체 및 표현식을 삽입하세요.
  • 형식 지정 Python의 문자열 형식 지정 미니 언어를 사용하여 f-문자열 형식 지정
  • Python 3.12 이상에서 f-문자열의 일부 멋진 기능 활용
  • f-문자열 대신 기존 보간 도구를 사용할 시기 결정

형식화된 문자열 리터럴이라고도 불리는 f-문자열은 여는 따옴표 앞에 f가 있는 문자열 리터럴입니다. 중괄호로 묶인 Python 표현식을 포함할 수 있습니다. Python은 해당 표현식을 결과 값으로 대체합니다. 따라서 이 동작은 f-문자열을 문자열 보간 도구로 전환합니다.

name = "Jane"
age = 25

f"Hello, {name}! You're {age} years old."

F-문자열에 표현식 포함

f"{2 * 21}"
name = "Jane"
age = 25

f"Hello, {name.upper()}! You're {age} years old."
f"{[2**n for n in range(3, 9)]}"

Python의 F-String을 사용하여 문자열 형식 지정

balance = 5425.9292

f"Balance: ${balance:.2f}"
heading = "Centered string"
f"{heading:=^30}"
integer = -1234567
f"Comma as thousand separators: {integer:,}"
sep = "_"
f"User's thousand separators: {integer:{sep}}"
floating_point = 1234567.9876
f"Comma as thousand separators and two decimals: {floating_point:,.2f}"
date = (9, 6, 2023)
f"Date: {date[0]:02}-{date[1]:02}-{date[2]}"
from datetime import datetime
date = datetime(2023, 9, 26)
f"Date: {date:%m/%d/%Y}"

F-문자열의 기타 관련 기능

F-문자열에서 객체의 문자열 표현 사용

ㅇ !s str() 메소드에서 문자열 표현을 보간합니다 ㅇ !r repr() 메소드에서 문자열 표현을 보간합니다

str() 특수 방법은 일반적으로 객체에 대해 사용자에게 친숙한 문자열 표현을 제공하는 반면, repr() 방법은 개발자 친화적인 표현을 반환합니다.

# person.py

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"I'm {self.name}, and I'm {self.age} years old."

    def __repr__(self):
        return f"{type(self).__name__}(name='{self.name}', age={self.age})"
from person import Person

jane = Person("Jane Doe", 25)

f"{jane!s}"
"I'm Jane Doe, and I'm 25 years old."

f"{jane!r}"
"Person(name='Jane Doe', age=25)"

첫 번째 f-문자열에서 !s 태그를 사용하여 .__str__()가 반환하는 문자열 표현을 보간합니다. 두 번째 f-문자열에서는 !r 플래그를 사용하여 현재 객체의 개발자 친화적인 문자열 표현을 보간합니다.

디버깅을 위한 자체 문서화 표현식

f-문자열에 변수 이름 뒤에 등호(=)를 사용하여 자체 문서화된 표현식을 만들 수 있습니다. Python이 f-문자열을 실행할 때 변수 이름, 등호 및 변수의 현재 값을 포함하는 표현식과 유사한 문자열을 작성합니다. 이 f-문자열 기능은 코드에 빠른 디버깅 검사를 삽입하는 데 유용합니다.

variable = "Some mysterious value"

print(f"{variable = }")

print(f”{variable=}“) variable=‘Some mysterious value’

print(f”{variable= }“) variable= ‘Some mysterious value’

print(f”{variable =}“) variable =‘Some mysterious value’

성능 비교: F-String과 기존 도구

# performance.py

import timeit

name = "Linda Smith"
age = 40
strings = {
    "Modulo operator": "'Name: %s Age: %s' % (name, age)",
    ".format() method": "'Name: {} Age: {}'.format(name, age)",
    "f_string": "f'Name: {name} Age: {age}'",
}

def run_performance_test(strings):
    max_length = len(max(strings, key=len))
    for tool, string in strings.items():
        time = timeit.timeit(
            string,
            number=1000000,
            globals=globals()
        ) * 1000
        print(f"{tool}: {time:>{max_length - len(tool) + 6}.2f} ms")

run_performance_test(strings)

F-문자열 업그레이드: Python 3.12 이상

따옴표 사용

person = {"name": "Jane", "age": 25}

f"Hello, {person['name']}! You're {person['age']} years old."
# python 3.11 

f"Hello, {person["name"]}!"
  File "<input>", line 1
    f"Hello, {person["name"]}!"

Python 3.12

person = {“name”: “Jane”, “age”: 25} f”Hello, {person[“name”]}!” ‘Hello, Jane!’

# python 3.11

f"""{
    f'''{
       f"{f'{42}'}"
   }'''
}"""

f"""{
    f'''{
        f"{f'{f"{42}"}'}"
    }'''
}"""

Python 3.11까지 f-문자열의 중첩 수준 수는 사용 가능한 문자열 구분 기호(“, ‘, <)에 의해 제한됩니다. 따라서 중첩 수준을 구분하는 데 사용할 수 있는 구분 기호는 오직 ““” 및’’’, 4개뿐입니다.

Python 3.12에서는 따옴표를 재사용할 수 있으므로 이 제한이 제거되었습니다.

Python 3.12

f”{ … f”{ … f”{ … f”{ … f”{ … f”Deeply nested f-string!” … }” … }” … }” … }” … }” ‘Deeply nested f-string!’

백슬래시 사용

3.12 이전 f-문자열의 또 다른 제한 사항은 포함된 표현식에 백슬래시 문자를 사용할 수 없다는 것입니다.

# python 3.11

words = ["Hello", "World!", "I", "am", "a", "Pythonista!"]

f"{'\n'.join(words)}"
  File "<input>", line 1
    f"{'\n'.join(words)}"

Python 3.12

words = [“Hello”, “World!”, “I”, “am”, “a”, “Pythonista!”]

f”{‘’.join(words)}” ‘Hello!!’

print(f”{‘’.join(words)}“) Hello World! I am a Pythonista!

인라인 댓글 작성

Python 3.11까지의 F-문자열에서는 포함된 표현식에 # 기호를 사용할 수 없습니다.

# python 3.11

employee = {
    "name": "John Doe",
    "age": 35,
    "job": "Python Developer",
}

f"""Storing employee's data: {
    employee['name'].upper()  # Always uppercase name before storing
}"""

Python 3.12

employee = { … “name”: “John Doe”, … “age”: 35, … “job”: “Python Developer”, … }

f”Storing employee’s data: { … employee[“name”].upper() # Always uppercase name before storing … }” “Storing employee’s data: JOHN DOE”

F-문자열 오류 메시지 해독

# Python 3.11

f"{42 + }"

오류 메시지는 일반적이며 문제가 있는 줄 내 오류의 정확한 위치를 가리키지 않습니다. 또한 표현식은 괄호로 둘러싸여 있는데, 이는 원본 코드에 괄호가 포함되어 있지 않기 때문에 문제에 잡음을 더합니다.

Python 3.12

f”{42 + }” File “”, line 1 f”{42 + }” ^ SyntaxError: f-string: expecting ‘=’, or ‘!’, or ‘:’, or ‘}’

Python 3.12에서는 오류 메시지가 더 장황합니다. 이는 영향을 받은 라인에서 문제의 정확한 위치를 알려줍니다. 또한 예외 메시지는 문제를 해결하는 데 도움이 될 수 있는 몇 가지 제안 사항을 제공합니다.

F-문자열에 대한 기존 문자열 형식 지정 도구 사용

f-문자열은 매우 멋지고 인기 있는 Python 기능이지만 모든 경우에 적용되는 일률적인 솔루션은 아닙니다. 때로는 모듈로 연산자(%) 또는 .format() 방법이 더 나은 솔루션을 제공할 수도 있습니다. 때로는 이것이 유일한 선택이기도 합니다. 이는 모두 특정 사용 사례에 따라 다릅니다.

사전 보간

person = {"name": "Jane Doe", "age": 25}

f"Hello, {person['name']}! You're {person['age']} years old."
"Hello, {name}! You're {age} years old.".format(**person)
"Hello, {name}!".format(**person)
"Hello, %(name)s! You're %(age)s years old." % person
"Hello, %(name)s!" % person

로깅의 지연 평가

f-문자열 또는 .format() 메소드를 사용하여 로깅 메시지를 구성하는 경우 Python은 선택한 로깅 수준에 관계없이 모든 문자열을 보간합니다. 그러나 % 연산자를 사용하고 보간할 값을 로깅 함수에 대한 인수로 제공하면 보간 프로세스가 최적화됩니다.

import logging
msg = "This is a %s message!"

logging.warning(msg, "WARNING")
logging.debug(msg, "DEBUGGING")
msg = "This is a {} message!"

logging.debug(msg.format("DEBUGGING"))

출처 : https://realpython.com/python-f-strings