Computer Engineering/Fluent Python 정리

Fluent Python Chapter 1. 파이썬 데이터 모델 (Feat. 일관성 있는 언어)

jordan.bae 2021. 12. 18. 02:00

Introduction

파이썬을 사용한지 5년 정도가 되었다. 하지만, 파이썬을 잘 알고 사용하고 있냐고 물으면 여전히 자신있게 답하기가 어렵다.

요즘 이것 저것 하다보니 어느 하나 정확히 알고 있는게 없는 것 처럼 느껴져서 지치고 힘든 감정을 느끼는 것 같다. 예전에 2019년에 스터디했던 Fluent Python(전문가를 위한 파이썬) 책을 Chapter별로 정리해봐야겠다는 생각이 들어서 이 글을 적고 있다. 부디 Chapter 21까지 정리를 마치고, 위의 물음에 잘 답변할 수 있게 되길...

 

Body

 

Chapter1은 파이썬의 데이터 모델에 대해서 이야기한다. 

 

여기서 말하는 데이터 모델은 객체의 모델이라고도 부르지만 파이썬 공식문서에 data model이라는 말을 사용하기 때문에 데이터 모델이라는 말을 사용한다고 한다.

 

아래 Reference에서 표시한 Python 공식문서의 Data model에 대한 문서를 읽어 보면 파이썬의 내장형 데이터 객체(Objects)들에 대한 소개와 내장형 객체들이 가지고 있는 magic method(Interface)들에 대해서 소개 하고 있다.

 

 

파이썬의 모든 객체는 세 가지 속성을 identity, type, value를 가지고 있다.

- identity는 메모리 주소

- type은 데이터의 type

- value는 메모리 주소에 저장되는 값

 

책에서는 내장형 자료형들이 가지고 있는 Magic method(인터페이스)들을 사용자들의 만든 Custom 객체에도 활용함으로써 얻게 되는 일관성을 파이썬의 가장 큰 장점이라고 말하고 있다.

 

여기서 말하는 일관성에 대해서 예를 들면 len() 과 같은 내장형 자료형을 위한 함수를 사용자가 만든 객체에서도 magic method를 구현해서 사용할 수 있고, 이런 부분이 파이썬을 쉽게 익숙해지도록 만든다.

 

한 가지 예를 들면, Django의 Object들을 다룰 때도 파이썬의 많은 내장  method들과 같이 사용합니다. 저는 인터프리터에서 Object의 인터페이스를 확인하기 위해서 항상 dir(object)를 호출해서 확인하고는 하는데 이는 사용자들이 만든 class도 내장형 자료형과 같이 같은 인터페이스를 제공하는거고 이런 일관성이 생산성에 큰 도움이 됩니다. 

 

책에서는 FrenchDeck이라는 Class를 예제 코드로 보여주면서 이를 토대로 설명을 이어 갑니다.

from collections import namedtuple

Card = namedtuple('Card' , ['rank', 'suit'])

class FrenchDeck:
    ranks = [str(i) for i in range(2, 11)] + list('KQJA')
    suits = ['spades' ,'diamonds', 'clubs', 'hearts']
    
    def __init__(self):
        self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]
    
    def __len__(self):
        return len(self._cards)
    
    def __getitem__(self, position):
        return self._cards[position]
        
 deck = FrenchDeck()


이제 FrenchDeck에서 magic method인 __len__()과 __getitem__() 을 구현함으로써 얻을 수 있는 것들을 살펴보겠습니다.

# len() 메서드를 활용할 수 있게 되었음. 
>>> len(deck)
52

>>> deck[1]
Card(rank='3', suit='spades')

# 임의로 카드를 선택하는 함수를 구현하지 않고도 바로 내부 메서드 choice를 사용할 수 있다.
>>> from random import choice
>>> choice(deck)
Card(rank='9', suit='diamonds')

magic method를 구현 함으로써 파이썬의 내부 자료형처럼 표준 메서드들을 통해서 표준 연산을 수행할 수 있습니다.

따로 method들을 만들 필요가 없고, 그 메서드 이름들을 기억할 필요가 없습니다. 이런 점이 파이썬이 여러 라이브러리와 잘 협력할 수 있는 부분이 아닐까라는 생각이 듭니다. 내부 자료형의 인터페이스들을 사용자 객체에서도 충분히 활용하고 확장할 수 있다는 점이!


조금 더 살펴 보면 __getitem__() 매직 메서드를 구현함으로써 iterator 연산자 in 연산자 등 또한 사용할 수 있습니다.

 

여기서 한 가지 알아둬야 할 부분은 magic method는 사용자들이 직접 호출하는게 아니라 파이썬 인터프리터가 호출하기 위한 메서드라는 점이다. my_object.__len__()으로 직접 호출하지 않고 len(my_object)를 호출하면 파이썬 인터프리터가 __len__()를 호출 한다. 그리고 이 부분에서 list, str, bytearray등과 같은 내장 자료형의 경우 파이썬 인터프리터는 PyVarObject C 구조체의 ob_size필드의 값을 반환한다. (메서드를 호출하는 방법보다 빠르다.)

 

이후에는 특별 메서드들의 종류에 대해 간단한게 소개한다.

 

Summary

위에서 살펴본 것 처럼 사용자가 정의한 객체도 특별 메서드를 구현함으로써 내장형 객체와 같이 동작하게 되어 파이썬스러운 코딩 스타일을 구사할 수 있다. 이 부분이 저자가 앞에서 말한 파이썬의 가장 큰 장점 중 하나로 소개한 일관성이 있는 부분일거라고 생각한다. 프로그래밍에서 일관성은 정말 중요하다. 생산성과 안정성에 가장 큰 영향을 주는 요소라고 생각한다. 앞으로는 파이썬스러운 파이썬 클래스를 만들 수 있길 바라면서 1장 정리를 마친다. 

 


Reference

- Fluent Python 1장

- https://docs.python.org/ko/3/reference/datamodel.html

 

3. 데이터 모델 — Python 3.10.1 문서

A class can implement certain operations that are invoked by special syntax (such as arithmetic operations or subscripting and slicing) by defining methods with special names. This is Python’s approach to operator overloading, allowing classes to define

docs.python.org

- Fluent Python

반응형