attrs 저자들이 사실 데이터 클래스 파이썬 도입 PEP 작업함. 파이썬 네이티브 데이터 클래스는 의도적으로 더 단순하고 이해 쉽게 유지, attrs는 원하는 전체 기능 범위 제공!
attrs를 내장 데이터 클래스 대신 선택할 이유:
파이썬 3.7 이전 버전 사용. attrs는 CPython 2.7, PyPy 포함 주류 파이썬 버전 모두 지원.
더 많은 기능 원함: attrs는 validator(검증자)와 converter(변환자) 제공.
최적 성능·최소 메모리 사용 원함: attrs 슬롯 클래스로.
기본 attrs 예제
아주 기본 예제부터 보자:
import attr
@attr.s
class Person(object):
name = attr.ib(default='John')
surname = attr.ib(default='Doe')
age = attr.ib(init=False)
p = Person()
print(p)
p = Person('Bill', 'Gates')
p.age = 60
print(p)
# 출력:
# Person(name='John', surname='Doe', age=NOTHING)
# Person(name='Bill', surname='Gates', age=60)
몇 가지 관찰:
문법이 데이터 클래스보다 덜 우아하고 장황하지만 추가 기능 얻음.
데이터 클래스처럼 출력 시 데이터 멋진 표현 얻음.
attrs 패키지는 attr.ib 같은 영리한 이름 써서 attr만 임포트하면 됨. 대안으로 전체 이름 임포트: from attr import attrib, attrs 후 그 이름 사용. 기능 동일.
이제 일반 데이터 클래스 대비 이 패키지 제공 가장 중요한 기능: validator와 converter 보자.
attrs validator 예제
attrs 데이터 클래스에 validator 추가 두 가지 방법:
데코레이터 사용
호출 가능 함수 제공
여기선 호출 가능 함수 방법 먼저 시연. attrs 몇 가지 validator 기본 제공, 그중 instance_of validator 다음 예제서 사용:
>>> @attr.s
... class C(object):
... x = attr.ib(validator=attr.validators.instance_of(int))
>>> C(42)
C(x=42)
>>> C("a string")
Traceback (most recent call last):
... TypeError: ("'x' must be <type 'int'> (got 'a string' that is a <type 'str'>).", ...
x에 문자열 값으로 객체 C 생성 시도하니 instance_of validator가 int 타입 요구하는데 문자열 와서 에러 던짐.
이제 우리 validator 정의:
import attr
@attr.s
class DividableByTwo(object):
x = attr.ib()
@x.validator
def check(self, attribute, value):
if value % 2 != 0:
raise ValueError(f'{value} is not dividable by 2')
print(DividableByTwo(60))
print(DividableByTwo(11))
# 출력:
# DividableByTwo(x=60)
# ...
# ValueError: 11 is not dividable by 2
attrs converter 예제
converter는 설정된 값 가져다 자동 변환. 여러 용도 가능. 예: 값 자동 int 변환. 다시 호출 가능 함수로 시작, 여기선 파이썬 int() 함수 그냥 사용:
import attr
@attr.s
class C(object):
x = attr.ib(converter=int)
c = C("1")
print(c)
# 출력:
# C(x=1)
입력(문자열 "1") 자동 정수 변환. converter는 validator 전에 실행되므로 변환 후 최종 값 검증 가능. 예: 위 두 예제 결합해 입력을 먼저 int로 변환, 그 후 2로 나누어 떨어지는지 확인.
attrs와 슬롯 사용
마지막으로, attrs에게 슬롯 클래스 사용 지시 가능. 슬롯 클래스는 일반 클래스 대비 이점:
작은 메모리 풋프린트
더 빠름
간단히: 슬롯 클래스로 객체 인스턴스 가질 예상 인스턴스 속성 명시. 이렇게 파이썬 일부 체크 등 생략해 메모리 사용 감소·약간 속도 증가. 자세한 건 attrs 문서 참조.
하지만 슬롯 클래스도 주의점 있음, 특히 수동 생성 시. 다행히 attrs가 기능 활성화 간단 방법 제공:
import attr
@attr.s(slots=True)
class YourClassName:
...