본문 바로가기

Study Information Technology

Python의 dataclasses 모듈로 데이터 구조 간편하게 관리하기

728x90
반응형

Python의 dataclasses 모듈로 데이터 구조 간편하게 관리하기

Overview

Python의 dataclasses 모듈은 데이터 구조를 정의하고 관리하는데 매우 유용한 도구입니다. 이 모듈은 Python 3.7부터 도입되었으며, 클래스의 보일러플레이트 코드(일반적으로 반복되는 코드)를 줄여줍니다. dataclasses를 사용하면 데이터 구조를 정의하고 이를 쉽게 초기화, 비교, 표현할 수 있으며, 코드의 가독성을 높일 수 있습니다.

dataclass의 기본 개념

dataclass 데코레이터를 사용하면 클래스를 정의할 때 자동으로 생성자(__init__), 표현 함수(__repr__), 비교 함수(__eq__), 그리고 기타 유용한 메서드를 자동으로 생성해 줍니다. 이 덕분에 데이터 저장 및 관리가 훨씬 간단해집니다.

기본 사용법

다음은 dataclass를 사용하는 간단한 예시입니다:

from dataclasses import dataclass

@dataclass
class Person:
name: str
age: int

# 객체 생성
person = Person(name="Alice", age=30)

# 데이터 접근
print(person.name)  # 출력: Alice
print(person.age)   # 출력: 30

# 객체 표현
print(person)       # 출력: Person(name='Alice', age=30)

위의 코드에서 Person 클래스는 두 개의 필드(name, age)를 가지고 있으며, dataclass 데코레이터는 자동으로 __init__, __repr__, __eq__ 메서드를 추가합니다.

필드 옵션

dataclass에서는 필드의 기본값을 지정하거나, 필드의 속성을 제어할 수 있습니다. 이를 위해 field 함수를 사용할 수 있습니다.

from dataclasses import dataclass, field
from typing import Optional

@dataclass
class Person:
name: str
age: int
address: Optional[str] = field(default=None, repr=False)
  • default: 필드의 기본값을 설정합니다.
  • repr: 해당 필드를 repr 함수의 출력에서 제외할 수 있습니다.

위의 코드에서 address 필드는 기본값으로 None을 가지며, repr 출력에서 제외됩니다.

불변 객체 만들기

dataclass를 사용하여 불변 객체를 만들 수 있습니다. 이를 위해 frozen=True 옵션을 사용합니다. 불변 객체는 생성 후에 필드 값을 변경할 수 없습니다.

from dataclasses import dataclass

@dataclass(frozen=True)
class Person:
name: str
age: int

# 객체 생성
person = Person(name="Alice", age=30)

# 불변 객체로 인한 수정 시도 시 에러 발생
try:
person.age = 31  # AttributeError 발생
except AttributeError as e:
print(e)  # 출력: cannot assign to field 'age'

메서드 추가

dataclass를 사용하는 클래스에 사용자 정의 메서드를 추가할 수도 있습니다. 이러한 메서드는 자동으로 생성된 메서드와 함께 사용됩니다.

from dataclasses import dataclass

@dataclass
class Person:
name: str
age: int

def greet(self):
return f"Hello, my name is {self.name} and I am {self.age} years old."

person = Person(name="Alice", age=30)
print(person.greet())  # 출력: Hello, my name is Alice and I am 30 years old.

비교 연산자

dataclass를 사용하면 객체 간 비교 연산이 간편해집니다. __eq__ 메서드가 자동으로 생성되어 두 객체의 모든 필드가 동일하면 True를 반환합니다.

from dataclasses import dataclass

@dataclass
class Person:
name: str
age: int

person1 = Person(name="Alice", age=30)
person2 = Person(name="Alice", age=30)
person3 = Person(name="Bob", age=25)

print(person1 == person2)  # 출력: True
print(person1 == person3)  # 출력: False

에러 처리

dataclass를 사용할 때 발생할 수 있는 일반적인 에러는 필드 값의 타입 불일치입니다. 예를 들어, int 타입으로 지정된 필드에 문자열을 할당하려고 하면 TypeError가 발생합니다.

from dataclasses import dataclass

@dataclass
class Person:
name: str
age: int

try:
person = Person(name="Alice", age="thirty")  # TypeError 발생
except TypeError as e:
print(e)  # 출력: __init__() argument 2 must be int, not str

이 문제를 해결하기 위해서는 필드 타입을 올바르게 지정하거나, 타입 검사를 추가하는 방법이 있습니다.

참고문서

728x90
반응형