한글판 johnsonj 2008.06.11
다음은 내가 파이썬에서 전혀 함정이 아닌 것이라고 생각한 것들을 간략하게 살펴본 목록이다. 다시 말해, 파이썬이 이런 특징을 갖추고 있기 때문에, 오히려 프로그래밍 실수가 줄어드는 것이다.
도우걸(Dougal)과 앤써니(Anthony) 그리고 토비(Toby) 에게 이런 안목을 허락해 주심을 감사드리는 바이다.
- 1. 모든 것들은 객체를 가리키는 이름일 뿐이다 (불가사의한 줄간-잡음은 없다)
- 파이썬은 따로 스칼라/참조 구문을 가지지 않는다! 축하할 일이다!
참조제거(Dereferencing)는 초보 프로그래머가 이해하기에 가장 어려운 개념중의 하나로서, 본인의 개인적 경험에서 보면 단지 C에서 포인터 연산과 참조제거 개념을 이해하지 못하기 때문에 온전한 프로그래밍 능력을 포기하는 사람이 있음을 알고 있다.
첨언: 아마도 다른 언어로부터 온 사람들이 파이썬의 "객체를 가리키는 이름"이라는 접근법에 대처하는데 어려움을 겪는 이유는 다른 언어에 그런 근본적인 함정이 있기 때문일 것이다. 참으로 많은 새내기 파이썬 프로그래머가 절망적으로 다음과 같이 물어보는 것을 본다. "참조로 건네려면 어떻게 하는 거에요?"
이 함정을 피하면: 신비한 줄간-잡음을 제대로 이해하지 못하거나 참조제거의 개념을 온전히 이해하지 못하기 때문에 다양한 에러들이 많이 일어난다.
- 2. 진정한 다형성
- (다른 말로해서, 다른 언어에서는 사용자에게 회돌이-점프, 모든-사용-사례-예측, 고정된-인터페이스, 천지개벽식의-유형-강제변환의 다형성을 강요한다.)
모든 것은 객체이고 내부적으로 인자의 유형을 점검하지 않는다. 인터페이스는 일반적으로 합의를 통하여 진화한다 - 파일 객체를 하나 받아 데이터를 읽어 들일 함수가 하나 작성되면, 어떤 객체든지 read() 메쏘드가 구현되어 있기만 하면 인자로 대신할 수 있다 - StringIO 실체, urllib.urlopen() 호출의 결과, 소켓 등등.
(기본 값과) 내장 가변 인자 리스트와 키워드 인자 리스트를 결합해서 정말로 맛있는 요리를 즐겨 보자!
이 함정을 피하면: 앞으로 코드가 또 어디에 사용될지 알지 못하므로 유연하지 못하다.
- 3. 연속열 풀기
-
아주 많이 사용된다. 메쏘드/함수로부터 여러 값들을 돌려줄 때 대부분 자동으로 풀어준다. 그리고 "a,b = b,a"는 올바르게 일을 한다.
이 함정을 피하면: 코드가 산만하다.
- 4. call 연산자
- 엮기 메쏘드와 함수 그리고 클래스...모두 정확하게 같은 인터페이스를 사용하며 모두 제일-클래스 객체들이다.
이 함정을 피하면: 다양한 종류의 호출 가능 객체들을 처리하고 (기억해야) 한다. 또한, #2 호출가능함수를 함수 인자로 받을 때 어떤 종류인지 걱정할 필요가 없다.
- 5. 자동 메모리 관리
- 드디어 시스템 탈취!
이 방어막이 있으면 사용자 입력 때문에 코드가 망가지고 시스템이 점령되는 일은 절대로 불가능하다 (주의: exec/eval 절대 사용금지).
이 함정을 피하면: 메모리 사용이 통제를 벗어난다. 실제 세계로부터 들어 오는 문자열의 임계를 점검하지 않기 때문에 시스템이 훼손된다.
- 6. print 서술문
-
다른 언어에서는 대부분 print 서술문이나 함수가 있지만 파이썬에서 print 서술문은 특별히 인간이-읽을 수 있는 형태로 방대한 정보를 쏟아낸다. 잘 작동한다. 이것은 주로 많은/대부분의 내장 객체들에 repr 메쏘드가 있기 때문이다.
어쨌든, 공백문자를 추가해주는 것이 좋다고 생각한다. 물론 쉼표가 따로 놀기는 하지만 말이다. 출력을 세밀하게 통제하고 싶다면, sys.stdout.write()를 사용하자.
이 함정을 피하면: 무슨 일이 일어나고 있는지 그냥 쉽게는 볼 수 없다.
- 7. 구조화를 위한 들여쓰기
- 들여쓰기를 하면 타자수를 줄일 수 있을 뿐만 아니라, 다른 언어에 비교하여 훨씬 더 쉽게 읽을 수 있다.
이 함정을 피하면: 코드가 읽기 힘들어진다. 꼭 사용해야 할 곳에서 블럭 구분자를 사용하지 않기 때문에 괴상한 에러들이 일어난다.
- 8. 언제 어디서나, 자유롭게 사용할 수 있는 예외 시스템
- 어느 곳이든지 사용할 수 있으며 사용되고 있다. 마음에 안 내키면 예외를 잡지 않으면 된다. 예외는 얼마든지 섬세하게 나포할 수 있으며, 예외와 함께 얼마든지 정보 객체를 보낼 수 있다. 그거 아주 마음에 든다.
- 9. 검사(Introspection) -역주: 자바의 내성(reflection), 자기자신을 들여다 보는 것(시선이 밖에서 안으로 이동함).
- 도우걸(Dougal)로부터 인용: 어떤 객체든지 들여다 볼 수 있다. 객체에 특정 속성이 있는지, 객체를 호출할 수 있는지 ..등등을 테스트해 볼 수 있다.
이 함정을 피하면: #6번 처럼, 거기에 들어가서 실제로 코드에서 무슨 일이 일어나고 있는지 알아 볼 수 있다.
- 10. 다-자랐고, 반석같이-단단하며, 간단한 내장 유형
- 그냥 튼튼한 내장 문자열과 터플 그리고 리스트와 사전 유형만 있으면 수 많은 문제를 피할 수 있다고 주장할 수 있다. 다른 언어에서 잠재적인 문제는 그런 유형들을 구현하면서 에러들이 야기되거나 또는 구현하려는 바보짓을 야기한다.
이 함정을 피하면: 쓸데없이 기본 유형 (재-)구현.
- 11. 깨끗한 이름공간 (오염시킬 생각이 없는 한)
- 도우걸(Dougal)로부터 한 번 더 인용: 파이썬은 자동으로 이름공간을 오염시키지는 않는다. 특별히 "from foo import *"과 같은 서술문으로 강제하지 않는 한 말이다.
이 함정을 피하면: 이름공간 오염과 괴상한 부작용이 일어남.
- 12. 파이썬 쉘 (상호대화 인터프리터)
- 토비(Toby) 가라사대: "특별한 이유가 없는 한 더 이상 계산기가 필요하지 않다 ;)". 그 마음 충분히 이해하며, 공감한다... 상호대화 인터프리터에서 초보 그리고 경력 파이썬 사용자들은 코드를 가지고 놀면서 무슨일을 하고 있는지 그대로 볼 수 있다. 상호대화 쉘 없이 정규 표현식을 개발한다는 것은 상상조차 할 수 없다 :)
이 함정을 피하면: 이것은 아이디어와 코드 조각을 테스트할 능력이 없다면 마주할, 수 많은 에러를 피하는데 필요한 도구 이상이다.
- 13. PDB
- 앤토니(Anthony) 가라사대: 내장된 디버거 PDB. 이것이 함정인지 아닌지는 잘 모르겠지만, 확실하게 목록에 올라 있다. 당신이 찾고 있는 마법의 문자열은 "import pdb ; pdb.set_trace()" 이다. 이 코드에 마주하면 pdb 쉘에 들어와 있을 것이다. 멋지다.
이 함정을 피하면: 일이 잘못되면, 살아 있는 프로그램을 직접 헤집고 들어가 왜 잘못되었는지 알아볼 수 있다. 그리고 필요하면 바로 그 시간 그 자리에서 산 채로 프로그램을 고칠 수 있다.
이 함정을 피하면: 프로그래머를 어린애처럼 대우하여, 프로그래머는 사소한 것들조차도 과도하게 명시해야 하며, 온갖 고통으로부터 헤어 나지 못한다.