포맷된 출력

매일 공부(ML)·2023년 1월 9일
0

Fluent Python

목록 보기
60/130

객체지향 상용구

파이썬스러운 객체

포맷된 출력

format() 내장 함수와 str.format() 메서드는 실제 포맷 작업을 format(format_spec) 메서드에 위임하고, format_spec는 포맷 명시자로서, format(my_obj, format_spec)의 두 번째 인수, str.format()에 사용된 포맷 문자열 안에 {}로 구분한 대체 필드 안에서 콜론 뒤의 문자열 중 하나를 통해서 지정한다.

brl = 1/2.43 #브라질 레알율 미국 달러로 바꾸는 환율
brl

format(brl, '0.4f')
'1 BRL = {rate:0.2f} USD'.format(rate=brl)

'{0.mass:5.3}'와 같은 포맷 문자열은 실제로는 두 가지 표기법을 사용하고, 콜론의 왼쪽에 있는 '0.mass'는 대체 필드 구문에서 필드명에 해당하는 부분이고, 콜론의 오른쪽에 있는 '5.3e'가 포맷 명시자이고, 포맷 명시자에 사용된 표기법을 '포맷 명시 간이 언어'라고 한다.


몇몇 내장 자료형은 포맷 명시 간이 언어에 자신만의 고유한 표현 코드를 가지고 있고, int형의 경우 이진수를 나타내는 'b', 16진수를 나타내는 'x'코드를 지원하며, float형의 경우 고정소수점을 나타내는 'f', 백분율 나타내는 '%'코드를 지원한다.

format(422,'b')

format(2/3, '.1%')

각 클래스가 format_spec 인수를 자신이 원하는 대로 해석해서 포맷 명시 간이 언어를 확장할 수 있으므로 datetime 모듈의 클래스들은 자신의 format() 메서드에서 strftime() 함수와 동일한 포맷 코드를 사용한다.

from datetime import datetime
now = datetime.now()
format(now, '%H:%M:S')
"It's mow {:%I:%M %[}".format(now)

클래스에서 format() 메서드를 정의하지 않으면 object에서 상속받은 메서드가 str(my_object)를 반환하고, Vector2d는 str()을 정의하지만 포맷 명시자를 사용하면 object.format()는 TypeError를 발생한다.

v1 =Vector2d(3,4)
format(v1)
format(v1,'.3f') #TypeError

Vector2d 클래스 자체의 포맷 간이 언어를 구현하면 이 문제를 해결할 수 잇고, 사용자가 제공하는 포맷 명시자를 벡터의 각 float형 요소를 포맷하기 위한 것으로 다음과 같은 결과를 나오기 가정하고, format()메서드를 구현한다.

v1 = Vector2d(3,4)
format(v1)
format(v1,'.2f')
format(v1,'.3e')

#Vector2d.format(), 클래스 내부

def __format__(self, fmt_spec=''):
	components = (format(c, fmt_spec) for c in self)
    return ('{}, {})'.format(*components)
profile
성장을 도울 아카이빙 블로그

0개의 댓글