파이썬에서는 @dataclass를 통해 데이터의 타입을 명시하고 안정적으로 다룰 수 있습니다.
이 글에서는 간단한 사용법을 소개하고 타입 확인까지 해보겠습니다.
@dataclass 사용법
먼저 다음처럼 코드를 작성합니다.
from dataclasses import dataclass
@dataclass()
class Data:
name: str
int: int
dict: dict
name은 str, int는 int, dict는 dict로 타입을 지정하였습니다.
이어서 데이터를 만들어보겠습니다.
data1 = Data(
name = "변덕순",
int = 1,
dict = {"a":"b"}
)
Data클래스를 활용해 data1 이라는 인스턴스를 만들었습니다.
print로 name과 타입을 출력해보겠습니다.
print(data1.name)
print(type(data1.name))
print(isinstance(data1, Data))
>>> 변덕순
>>> <class 'str'>
>>> True
‘name’과 ‘name의 타입’이 정상적으로 출력됩니다.
또한 ‘인스턴스’와 ‘Data클래스’간 타입도 일치하는 것을 볼 수 있습니다.
만약, name에 다른 타입을 할당한다면 어떻게 될까요?
# 위의 코드에서 이어서 작성합니다.
data1.name = 1234
print(data1.name)
print(type(data1.name))
>>> 1234
>>> <class 'int'>
str 타입이었던 name이 int로 바뀌었습니다…
@dataclass는 기본적으로 타입을 강제하지는 않습니다.
그렇기 때문에 타입을 지정했더라도 얼마든지 바뀔 수 있습니다.
frozen=True 옵션
다행스럽게도 @dataclass에서는 타입을 강제하는 방법이 있습니다.
파라미터에 frozen=True 옵션을 넣으면 지정해둔 타입으로 강제할 수 있습니다.
아까 코드를 다시 불러와 보겠습니다.
@dataclass(frozen=True)
class Data:
name: str
int: int
dict: dict
@dataclass의 파라미터에 frozen=True을 넣었습니다.
이제 Data클래스는 우리가 지정한 타입을 강제합니다.
아까와 동일한 데이터를 넣고 name에 다른 타입의 값을 할당해보겠습니다.
data1 = Data(
name = "변덕순",
int = 1,
dict = {"a":"b"}
)
data1.name = 1234
print(data1.name)
print(type(data1.name))
>>>
Traceback (most recent call last):
File "/", line 22, in <module>
data1.name = 1234
File "<string>", line 4, in __setattr__
dataclasses.FrozenInstanceError: cannot assign to field 'name'
name 필드에 값을 할당할 수 없다는 에러메시지가 나왔습니다.
이제는 @dataclass가 타입을 강제하기 때문입니다.
마무리
이처럼 @dataclass를 활용하면 데이터를 안전하게 관리할 수 있습니다.
예를 들어 DTO(data transfer object)처럼 데이터를 안전하게 이동해야 할 때 활용하기 적합합니다.
'나는 이렇게 학습한다 > Language' 카테고리의 다른 글
Python _ TypedDict를 사용하는 이유(feat. mypy) (0) | 2022.06.22 |
---|---|
Python _ dict의 keys()처럼 dataclass에서 속성 목록 가져오기 (0) | 2022.06.21 |
Python _ 런타임 중에 스크립트 파일 실행하기 (0) | 2022.04.28 |
Python _ @property로 getter, setter 구현하기 (feat. 캡슐화) (0) | 2022.04.02 |
Python _ @classmethod, @staticmethod 란 무엇인가? (0) | 2022.03.31 |