Python에 대한 내 관점

Posted on Sep 4, 2020

Python은 조금 지루한 문법의 언어다. 거기에 매크로 같은 기능도 없어서 항상 평이한 문장을 작성하게 되는 것 같다.

하지만 다른 비슷한 언어들과는 다르게, 파이썬 문장 자체는 깔끔하면서도 density가 높다. 리습, 하스켈 같은 언어들으로 작성한 것을 생각해봐도 밀도가 높아 표현력이 좋다.

Java와 같은 언어는 밀도도 낮고 표현력도 가끔은 너무 아쉽다.

파이썬이 이렇게 밀도가 높을 수 있는 이유는, 언어 자체적으로 매크로를 지원하거나 해서 문법을 확장하는 방법을 채택하는 것이 아니라 SymPy에서 그랬었던 것처럼 값을 계속 쌓아갈 수 있게 만들고 연산자를 재정의해서 문장이 다르게 해석되도록 만드는 방법이고, 이쪽이 더 Pythonic한 방법 같다.

그리고 그렇기 위해서 언어에 내장된 construct들이 꽤 유연하고 일관성 있는 방법으로 재사용될 수 있게 설계되어 있기 때문이라고 생각한다.

과거로부터 C++의 천재적인 generic programming, STL의 아이디어랑 비슷한 모습이기도 한 것 같다. C++의 그런 점들은 과거에는 비아냥의 대상이었던 것 같다. 하지만 지금에 와서야 돌아보면, 함수형이니 객체지향이니 더 bloated된 객체를 설계하게 만들고 더 느리고 무거운 결과 코드를 만들도록 하는 방법들을 더 낫다고 생각했었던 것 같다. 하지만 내 생각엔 C++의 의도와 목적을 그런 사람들은 오해했었던 것 같다. 최근에 Rust에서 오버헤드 없이 컴파일 하기 위한 STL, generic programming 같은 것들을 그대로 가져와 사용하는 것을 보며 이제서야 조금은 이해를 해나가는 것 같다.

그런 Python의 construct은 with 문, for 같은 것들인 것 같다. 그리고 많은 부분에서 with 은 재밌게 응용할 부분이 많다. 마치 Lisp계열에서 let, flet, macrolet 이나 anaphoric macro 처럼 만들수도 있을 것 같다.

내 경우에는 다음과 같은 부분에 썼었었다:

  1. DB 트랜잭션 처리: 예외가 발생하는지에 따라서 commit/rollback.
  2. DB등 Connection Pool: Connection을 얻고 다시 put-back하는 처리.
  3. Stopwatch: 애플리케이션의 특정 코드 영역의 실행시간을 측정, 누적-통계.

매크로와 같이 그 내용 블럭의 평가/실행을 조절하거나 새로운 바인딩을 만들지는 못할 것 같다. 그럼에도 iterator, generator와 같이 일관된 방법으로, 또 아주 간단하게 언어의 의미를 확장할 수 있는 방법인 것 같다.