여정의 기록

[Python] @dataclass() 모듈을 사용하는 이유 본문

공부/Python

[Python] @dataclass() 모듈을 사용하는 이유

Chelsey 2022. 12. 27. 17:04
728x90

Kaggle 경진대회에 참가하고 있다. 다른 사람들은 어떻게 문제를 풀었는지 읽어보고있는데

@dataclasses 라는 모듈이 눈에 보였다. @가 붙은 많은 모듈이 눈에 보였다.

이것에 대해 간단하게 작성하려 한다.

 

우리는

변수에 원하는 데이터를 담아 사용할수 있듯이 클래스를 이용해 원하는 데이터를 저장하여 사용할 수 있다.

하지만 우리가 클래스에 원하는 데이터를 기록하고 저장하고 사용하는데는 여러코드가 필요한데 - 그 중에서도 해당 클래스를 불러서 확인할 때 데이터가 원하는 변수에 잘 들어갔는지 확인하는 것이라던가 같은 데이터라면 동등성equality를 가지게 해준다던가 - 원하는 기능들을 __repr__ , __eq__ 라는 함수를 넣어서 변수를 다시 하나하나 적어줘야한다. 데이터 클래스란 이러한 중복하며 계속 변수를 적는 과정을 줄여준다. (실수를 줄여주고 번거로움을 줄여준다!)

 

방법

dataclasses 모듈을 사용할 일반 클래스에 @dataclass 라고 선언만해주면 된다.

__inint__(), __repr__(), __eq__() 와 같은 메서드를 자동으로 생성해준다.

 

데이터를 자유자재로 변경할 수도 있다.

  1. 데이터의 불변성 immutability 보장하려면 frozen을 True로 선언한다. 이는 데이터를 변경할 수 없게 해준다.
    @dataclass(frozen=True)
  2. data class안에서 인스턴스 간 대소비교를 하기 위해선 order=True라는 옵션을 주어야한다. 정렬이 가능해진다.
    @dataclass(order=True)
  3. hashable 하지 않기 때문에 set의 값이나 dict의 키로 사용할 수 없다. 하지만 원한다면 unsafe_has=True 옵션을 사용할 수 있다. set을 이용해서 중복 제거도 가능하겠다. 
    @dataclass(unsafe_has=True)
  4. 클래스에서 정의한 filed default 값은 instence 간에 공유한다. 그래서 그냥 [] 기본값 할당하는 것은 불가능하다. 하지만 또한 원한다면 매번 새로운 리스트가 생성될 있도록 허가해주는 방식을 사용하게 되는데, filed(default_factory=list) 이런 옵션을 사용한다

 

1, 2, 3 의 예시)

@dataclass(frozen=True, order=True, unsafe_has=True)

4의 예시)

@dataclass
class C:
    mylist: list[int] = field(default_factory=list)
    
c = C()
c.mylist += [1, 2, 3]

 

이외의 다른 기능들은 https://docs.python.org/3/library/dataclasses.html 여기에서 확인할 수 있다.


 

https://www.daleseo.com/python-dataclasses/ 를 읽고 공부하고 간단하게 요약했습니다. 글 감사합니다.

728x90