What is Pythonic?:
저자 마틴 파센(Martijn Faassen)
한글판 johnsonj 2005.10.15 원문위치

도데체 `파이썬스러움`이란 무엇인가?

이 질문은 몇 달전, 유로파이썬 메일링 리스트 곳곳에서 올라왔었다. 메일링 리스트는 주로 유로 파이썬 회의를 계획하는데 사용되었다. 그렇지만 흥미있는 질문이었다. 그 단어가 많이 사용된 것은 보았지만, 그것이 무슨 뜻인지 설명하려는 시도는 본 적이 없다. 열띤 줄토론에서 나를 포함하여 각자가 자신만의 해답을 내놓았다. 다른 사람들의 의견을 참고하여, 나의 웹로그에 재기록해 두는 바이다.

"파이썬스러움"이라는 개념은 애매하지만, "지성"이라든가 "삶" 같은 개념에 비하면 그렇게 애매한 것도 아니다. 이런 개념들은 실제로 정의를 해보려고 하면 곤란한 상황에 빠지는 경향이 있다. 그렇지만 정의하기 어렵다는 것이 곧 쓸모가 없음을 뜻하지는 않는다; 인간은 산만한 정의를 가지고도 잘 살아간다. "파이썬스러움"이란 곧 "관용구적인 파이썬"을 뜻한다. 하지만 이제 실제로 그것이 무엇을 뜻하는지 설명할 필요가 있다.

시간이 지나면서, 파이썬 언어는 진화하고, 공동체는 성장했는데, 파이썬을 올바르게 사용하는 방법에 관하여 수많은 아이디어가 떠 올랐다. 파이썬 언어는 수 많은 작업을 완수하는데 적극적으로 수 많은 관용구들을 장려한다("일을 하는데 있어 효율적인 방법은 하나다"). 파이썬 공동체에서 진화한 새로운 관용구들은 이제 자신들을 더 잘 지원하도록 파이썬 언어의 진화에 영향을 준다. 예를들어 사전의 .get() 메쏘드 채용이 그런 진화의 예로 간주될 수 있다. 이 메쏘드는 예전에 has_key()와 원소 접근을 조합하여 처리하던 일을 할 수 있다.

관용구들은 다른 프로그래밍 언어로부터 쉽게 이식가능한 경우는 거의 없다. 예를 들어, C의 리스트에서 모든 요소를 처리하는 관용적인 방법은 다음과 같다:

for (i=0; i < mylist_length; i++) {
   do_something(mylist[i]);
}

파이썬으로 직접 이식하면 다음과 같을 것이다:

i = 0
while i < mylist_length:
   do_something(mylist[i])
   i += 1

그렇지만, 작동하더라도 파이썬스럽지는 않다. 파이썬에서 장려하는 관용구가 아니다. 개선이 가능하다. 리스트에 모든 숫자를 발생시키는 파이썬의 전형적인 관용구는 내장 range() 함수 같은 것들을 사용하는 것이 될 것이다:

for i in range(mylist_length):
   do_something(mylist[i])

그렇지만 이것 역시 파이썬스럽지 않다. 다음이 파이썬 언어에서 장려하는 파이썬스러운 방법이다:

for element in mylist:
   do_something(element) 

comp.lang.python에 참조점을 직접 넘겨주거나 변경하는 방법에 관한 질문이 자주 올라온다. 이는 파이썬에서 불가능하다; 그저 할당만이 있을 뿐이다 (그의 친족들 import, class 그리고 def 서술문들도 마찬가지다). 이는 의심할 바 없이 한 함수로부터 여러 값을 돌려주는 코드를 작성하고 싶은 경우이다. C 와 기타 언어에서 이렇게 하는 관용적인 방법은 이 함수의 포인터 즉 참조점을 넘겨주는 것이다:

void foo(int* a, float* b) {
    *a = 3;
    *b = 5.5;
}

...
int alpha;
int beta;
foo(&alpha, &beta);

파이썬에서 인자를 통하여 함수 결과를 돌려주는 전략을 꾸미는 것도 가능하다. 예를 들어 다음과 같이 말이다:

def foo(a, b):
    a[0] = 3
    b[0] = 5.5

alpha = [0]
beta = [0]
foo(alpha, beta)
alpha = alpha[0]
beta = beta[0]

그렇지만 이는 정말로 파이썬스럽지 않다. 한 함수로부터 여러 함수를 돌려주는 관용적인 방법은 아주 다른 모양으로서 훨씬 더 보기가 좋다. 터플과 터플 풀기를 활용한다:

def foo():
    return 3, 5.5

alpha, beta = foo()

파이썬답지 못한 코드는 경험있는 파이썬 프로그래머가 보기에 이상할 뿐만 아니라 거추장스럽게 느껴진다. 또한 이해하기에 너무 번잡하고 어려울 수도 있다. 왜냐하면, 일반적이고, 잘 알고 있는, 짧은 관용구를 사용하는 대신에 또다른 기다랗고, 지루한 코드를 사용하여 원하는 효과를 달성하기 때문이다. 파이썬 언어는 올바른 관용구들을 지원하는 경향이 있기 때문에, 비-관용적인 코드는 더 느리게 실행되는 경우가 많다.

파이썬스럽다는 것은 깨끗하고 가독성 있는 관용구로 파이썬 실행구조와 데이터구조를 사용하는 것이다. 예를 들면 동적인 형정의를 적극 이용하는 것은 파이썬답지만, 불필요하게 정적-유형 정의 스타일을 도입하는 것은 분명히 파이썬스럽지 않다. 파이썬스럽다는 것은 경험있는 파이썬 프로그래머가 과업을 완수하는데 생소한 방법을 동원하는 것을 보고 놀라지 않도록 하는 것이다.

"파이썬스러운"이란 단어는 또한 낮은-수준의 관용구를 넘어서 적용할 수도 있다. 라이브러리나 작업틀이 파이썬스러우려면 파이썬 프로그래머가 과업을 수행하는 법을 선택할 수 있도록 되도록이면 쉽고 자연스러워야 한다. 파이썬으로 작성되었다고 할지라도, 프로그래머에게 귀찮거나 비-관용적인 파이썬 코드를 작성하도록 강요하는 라이브리나 작업틀은 파이썬답지 못하다고 간주될 수 있다. 어쩌면 예를 들어, 클래스 같이 파이썬이 제공하는 실행구조를 사용하지 않고 있을 수 있다. 비록 이해하기에 더 쉽고 더 효율적으로 그 라이브러리를 만들었다고 할지라도 말이다. 사용하면 편리할 수 있는 곳에서 함수에 인자로서 함수와 메쏘드를 건네는 것을 간과했을 수도 있다. 라이브러리 안에 정의된 한 클래스는 최선을 다하여 정보 은닉을 시도하려고 할 수도 있다. 마치 자바 같은 언어에서 그런 것처럼 말이다. 반면에 파이썬은 `조언적 잠금`이라는 더 느슨한 전략하에서 운영된다. 여기에서 속성들은 보통 볼 수 있지만, 프로그래머는 이끄는 밑줄을 보고 그 속성이 사적이라는 사실을 짐작한다.

물론, 그런 거대한 규모의, 라이브러리와 작업틀을 완성하면, 파이썬스럽든 아니든 좀 더 자랑스러울 것이다. 그렇지만 여전히 가이드라인이 있다. 그 중 하나는 번잡하지 말아야 한다는 것이다: 파이썬 라이브러리의 API들은 같은 일을 하는 자바 라이브러리에 비하여 더 작고 가벼운 경향이 있다. 무겁고, 과도하게 공들인 API를 갖춘 파이썬 라이브러리는 별로 "파이썬스럽지" 못하다고 간주된다. 예를 들면 파이썬에 여러번 구현된 바 있는, W3C XML DOM API는 파이썬스럽다고 간주되지 않는다. 어떤 사람들은 "자바-스럽다"고 생각한다. 물론, 내가 듣기로는 많은 자바 프로그래머들도 사실 자바-스럽지 않다고 생각한다고 한다...

같은 일을 완수하기 위하여 이미 관용구가 존재하는 곳에서 너무 많이 수레바퀴를 또다시 만들려고 시도하지 않는 파이썬-기반의 작업틀은 파이썬스럽다고 간주될 수 있다. 관용구에 관한 한 일반적인 파이썬 관례도 준수해야 한다.

물론 그 문제는 작업틀이, 작업틀이기 때문에, 거의 필연적으로 작은 어플리케이션에 익숙하다면 생소하게 느껴질 만한 패턴과 방법들을 도입하여 일을 하려고 시도하기 때문이다. 그것이 바로 작업틀의 강점을 활용하는 방법이다. 본인의 손에 익숙한 작업틀인, 조프 2는 다른 곳에서는 마주하기 힘든 수 많은 특정한 방법들을 도입하여 일을 하는 작업틀의 한 예이다. 획득(Acquisition)이 한 예이다. 결과적으로, 경험있는 많은 프로그래머들은 조프 2가 별로 파이썬스럽지 않다고 생각한다.

파이썬다운 작업틀을 만드는 일은 어렵다. 무엇이 멋지고, 관용적인지 잘 안다고 해도 별로 도움이 되지 않는다. 좋은 파이썬 코드는 해를 거듭하면서 아주 비약적으로 진화하였다. 발생자와 집합, 그리고 유니코드 문자열과 datetimes는 이제 파이썬답다고 간주된다. 조프 2는 세월을 보여주는 작업틀의 한 예이다. 부분적으로 그 때문에 비난할 수는 없다. 처음 개발된 때가 1997년 경이었다. 그 점을 고려하면, 실제로는 잘 견디고 있다. 조프 고마워.

최근에 본인이 목도한 파이썬스러움의 새 경향은 파이썬의 꾸러미와 모듈 구조의 관용구를 표준화하는 방향으로 움직이고 있다는 것이다. Twisted, Zope 3, and PyPy 같이 더 새로와진 코드기반이 모두 이 패턴을 따르고 있다:

나 역시 lxml 같이 내가 작성한 라이브러리에 다음 관례를 따랐다.

가끔 이런 생각이 든다. 소프트웨어를 `파이썬답지 않다`고 폄하하는 것은 정당하지 않으며 그 때문에 그 소프트웨어의 반대쪽 긍정적 측면을 보지 못할 수도 있다고 말이다. 파이썬 프로그래머가 익히기 쉬운 좀 약한 작업틀이 배우기에 더 많은 시간이 소모되는 훨씬 더 강력한 시스템보다 더 파이썬스럽다고 간주될 수도 있기 때문이다.

마지막으로, 무엇이 파이썬다운 디자인인지 보완해 줄 또다른 관점이 보고 싶다면, 파이썬 인터프리터에서 다음을 타자해 넣어보자:

import this
따로 고지하지 않는 한, 마틴 파센(Martijn Faassen)이 허가한 웹소는 모두
창조적 공공재 라이센스(Creative Commons License)를 따른다.