코드로 우주평화

Python _ @dataclass 사용법과 타입 확인 본문

나는 이렇게 학습한다/Language

Python _ @dataclass 사용법과 타입 확인

daco2020 2022. 5. 18. 19:55

파이썬에서는 @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)처럼 데이터를 안전하게 이동해야 할 때 활용하기 적합합니다.