Computer Engineering/Python

파이썬은 얼마나 똑똑한가?

jordan.bae 2020. 4. 14. 19:43

Python은 얼마나 똑똑한가?

 

Smart Python!

 

제목만 보면 먼가 AI와 관련된 글 같지만 사실 이 글은 파이썬의 데이터 모델에 대한 철학에 대한 이야기입니다... (여기까지 속아서 들어왔으니 끝까지 읽어보시는 게 어떠실까요?..)

이 글에서 2개의 class를 정의하고 이를 통해서 파이썬이 얼마나 똑똑한지 증명해보려고 합니다.

 

아래와 같이 Foo 라는 class가 있고, 이 Foo라는 clsss는 __getitem__() 이라는 메서드 하나만 구현되어 있습니다.

class Foo:    
	def __getitem__(self, position):        
    	return range(0,30,10)[position]

 

 

f = Foo()

# output이 어떻게 나올거라고 예상하시나요
for i in f: print(i)

 

아마 결과가

0

10

20

 

이 나올거라고 예상하신 분도 있고, 에러가 날 것 같다고 예상하신 분들도 있을 것 같습니다.

파이썬 인터프리터는 __iter__()메서드가 구현되어 있지 않아도 자연스럽게 객체를 반복해서 순회합니다. 그 동안 저희는 너무 당연하게 여겨 왔지만, 어리둥절(이게 머 어떻다고?) 하시는 분도 계실 것 같습니다.

 

 

그럼 하나 더 살펴보겠습니다.

20 in f
True

 

아니 이번에도 마찬가지로 __contains__() 메서드가 구현되어 있지 않더라도 python은 또 이것을 해냈습니다. 

저희는 그 동안 아무생각 없이 코드를 적고 에러가 나면 어 낫네 하면서 고쳤던 것도 파이썬이 똑똑해서 일수도 있습니다….!

 

어떻게 된 것 일까요?

 

파이썬 데이터 모델은 가능한 한 많이 핵심 프로토콜과 협업하겠다는 철학을 가지고 있습니다. 

(정말 똑똑하고 부지런한 녀석입니다. 과장을 많이 하면 하나를 알려주면 나머지 알아서 한다는 말과 비슷합니다. 가끔 여러분 곁에 훌륭한 동료들이 대충 말해도 모두 처리하는 것처럼 말이죠! 저도 그런 훌륭한 동료가 되고 싶네요!)

파이썬은 __iter__()와 __contains__() 메서드가 구현되어 있지 않았지만 __getitem__() 메서드를 호출해서 객체를 반복하고 in 연산자를 사용할 수 있게 해 줍니다.

 

저는 이러한 파이썬의 데이터 모델에 대한 철학이 깐깐하게 객체의 인터페이스를 정의하고 너 a,b,c 함수 모두 구현했어?라는 체크 없이 프로그래밍을 해도 많은 부분을 보완해준다고 생각합니다.

즉, 여기서 Foo class는 abc.Sequence를 상속받지 않았지만 abc.Sequence가 지원하는 일부분 protocol을 수행할 수 있습니다.

 

 

하나의 예를 더 들어보면,

 

class Bar:    
	numbers = [i for i in range(10)]
    
    def __init__(self):
    	self._numbers = self.numbers
    
    def __getitem__(self, position):
    	return self._numbers[position]
    
    def __len__(self):
    	return len(self._numbers)
        
 
b = Bar()
a = list(reversed(b))
print(a)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
 
 
1 in b
True

b[0:5]
[0, 1, 2, 3, 4]

 

이것도 마찬가지로 저희에게는 너무 당연한 동작일 수 있지만, 다른 한편으로 이렇게 간단한 구현으로 이렇게 많은 함수들 지원한다는 것에 놀랍습니다.

 

 

Bar 클래스는 이렇게 두 함수를 구현함으로써 sequence 프로토콜을 지원하는 객체가 됐습니다.

 

 

이 글은 Fluent Python의 Chapter 11의 일부분을 제 방식대로 정리한 글입니다.

호응이 좋으면, 사실 호응보다는 제가 게으르지 않다면 다음으로 파이썬의 프로토콜 그리고 덕 타이핑 그리고 구스 타이핑 그리고 ABC까지 다루는 글을 써볼 예정입니다.

 

짧지만 제가 책을 읽으면서 재미있게 읽은 부분이어서 다른 분들에게도 한 번 전달해보고 싶어서 글을 썼습니다!

혹시, 제가 잘 못 이해하고 있는 부분이 있거나 공유해주고 싶은 것들이 있으시면 편하게 댓글로 알려주시거나 메일을 주시면 감사 하겠습니다.


그리고 조금 더 자세한 내용이 궁금하신 분은 책을 한 번 직접 읽어보시는 것도 추천드립니다!

 

YES24의 해당 책 링크

 

감사합니다!

 

 

 

Buy me a coffeeBuy me a coffee
반응형