이콜레모 개발자 위키

파이썬


Youngrok Pak at 3 years, 6 months ago.

루비, 자바스크립트처럼 높은 생산성을 낼 수 있으면서 그럭저럭 참아줄 만한 성능을 낼 수 있는 언어. Dropbox, Instagram 등은 파이썬을 잘 활용해서 기술적으로 뛰어난 성과를 이루어낸 대표적인 사례. 자바, C와 함께 구글의 3대 공식 프로그래밍 언어이기도 하다.

  1. 파이썬 패키지 관리
  2. 문자 처리
    1. 인코딩
    2. URL Encoding
    3. 정규식
    4. 한글
  3. 웹 개발
    1. 웹 프레임워크
    2. 서버
    3. 클라우드 호스팅
    4. 디플로이
  4. 로깅
  5. 파이썬 개발 도구
  6. XML과 HTML
  7. TaskQueue
  8. HTTP 클라이언트
  9. 비동기 통신
  10. 파서
  11. 윈도우에서의 파이썬

파이썬 패키지 관리#

문자 처리#

인코딩#

파이썬 모듈 .py 파일의 인코딩은 첫 줄의 주석으로 선언한다.

# coding: utf8

파이썬 2.x에서는 문자열을 처리하는 타입이 str과 unicode 두 가지다. str은 바이트로 인코딩된 문자열이며, unicode는 추상적인 문자셋이다. 따라서 unicode를 str로 변환할 때는 인코딩을 지정해서 encode하며, str을 unicode로 변환할 때는 인코딩을 지정해서 decode한다.

>>> '한글' # print repr('한글')
'\xed\x95\x9c\xea\xb8\x80'
>>> print '한글'
한글
>>> u'한글'
u'\ud55c\uae00'
>>> print u'한글'
한글
>>> '한글'.decode('utf8')
u'\ud55c\uae00'
>>> u'한글'.encode('utf8')
'\xed\x95\x9c\xea\xb8\x80'
>>> u'한글'.encode('euc-kr')
'\xc7\xd1\xb1\xdb'

파이썬 3에서는 str이 파이썬 2.x의 unicode 역할을 하며 기존 str은 bytes로 바뀌는데, 이건 이제 문자열이 아니라 바이트 배열에 가깝다. 자바의 String과 byte[]의 관계와 비슷하다고 보면 된다. 참고로 파이썬 3에서는 변수명이나 함수명 등의 identifier도 한글을 쓸 수 있다.

URL Encoding#

URL에 사용할 수 없는 문자를 사용할 수 있는 문자 집합으로 변환하는 것. 이것도 두 가지가 있는데, 공백을 %20으로 변환하는 것과 +로 변환하는 것이 다르다.

>>> urllib.quote('안녕 python')
'%EC%95%88%EB%85%95%20python'
>>>urllib.quote_plus('안녕 python')
'%EC%95%88%EB%85%95+python'

URL의 path 부분은 urllib.quote로 해야 하고, 폼 데이터는 urllib.quote_plus가 표준 권고사항이지만 urllib.quote를 써도 괜찮다.

urllib.urlencode는 dict를 urllib.quote를 이용해서 인코딩된 문자열로 바꾼다.

정규식#

파이썬 정규식에서 다른 정규식과 다른 점은 캡처하는 문자열에 이름을 붙이는 방식이다.

한글#

  • korean gettext의 한글 특이사항 반영, 초성 분리 등
  • hangulize 외국어의 한글 발음

웹 개발#

웹 프레임워크#

실용적인 프로젝트를 해야 한다면 Django를 써라. Flask는 쉽고 꽤 편하고 나름 트렌디하지만, 좋은 설계라고 볼 수 없으므로 권하지 않는다. TurboGears는 망했다. Pylons는 Pyramid로 이름이 바뀌었지만 역시 망했다. Tornado는 반짝 떴다가 지금은 그냥 서버 엔진으로만 쓰이는 경우가 많다.

삽질해가면서 하는 것도 괜찮다면 파이썬 위키의 WebFrameworks를 뒤져가면서 실험해볼 수 있고, gevent나 twisted, eventlet 등으로 좀더 하드코어하게 해볼 수도 있겠다.

서버#

성능은 uwsgi가 가장 빠르다. gunicorn은 설정하기 간편하지만 큰 차이는 아니다. gevent를 같이 쓰면 성능 향상을 볼 수 있는 경우가 있다.

클라우드 호스팅#

  • webfaction
  • heroku

디플로이#

fabric이 많이 쓰이지만, chefpuppet 같은 막강한 기능을 가진 것은 아니고 그냥 ssh streamlining 도구다.

로깅#

http://victorlin.me/posts/2012/08/good-logging-practice-in-python/

파이썬 개발 도구#

자동 완성, 소스 찾아가기 등의 문법 지원 기능을 제대로 쓸 수 있는 IDE는 이클립스 PyDev와 PyCharm 둘 뿐이다. 이외에는 자동완성을 흉내만 낼 뿐 제대로 되지 않으므로, IDE가 필요하면 다른 것은 살펴볼 필요도 없고 둘 중에 고르면 된다. 최근 Python Tools for Visual Studio도 제대로 문법지원을 해준다는 설이 있다.

문법 지원은 필요 없고 문법 강조(Syntax Highlight)만 잘 되어도 된다면 선택의 폭은 훨씬 넓다. vi도 충분히 괜찮고, Sublime Text는 멀티플랫폼을 잘 지원하고 속도가 겁나 빠르며, 무려 파이썬으로 플러그인을 작성할 수 있어 Emacs 부럽지 않다. 물론 그래도 IDE 쪽을 추천한다.

IDE를 쓰더라도 IPython은 필수.

XML과 HTML#

현재 파이썬에서 XML 처리의 de facto standard가 되어가고 있는 것은 lxml이다. libxml2에 기반하고 있어 다른 XML 라이브러리에 비해 압도적으로 성능이 좋고, XPath, CSS selector 쿼리 등의 지원도 좋다. 다만, XML을 pythonic하게 재해석한 ElementTree의 문법을 사용하는데, 장단점이 있다. DOM vs ElementTree를 참조하라.

XML 표준 DOM API를 쓰고 싶다면 dom의 기본 구현체인 minidom을 쓰면 된다. minidom 역시 DOM 표준을 다 지원하는 것은 아니지만, 핵심적인 기능은 다 된다. minidom에서 XPath를 쓰려면 py-dom-xpath을 사용한다. css query는 직접 지원하지는 않고 cssselectXPath 문법으로 변환한 후 사용하면 된다. lxml의 xpath는 libxml2의 C 구현체를 사용하므로 속도가빠르지만 py-dom-xpath은 성능이 그리 좋지 않다.

HTML의 경우는 minidom의 파서나 lxml의 html 파서나 둘다 HTML5 문서를 XML 파서처럼 파싱하므로 브라우저가 파싱하는 것과 차이가 있다. html5lib는 최신 브라우저와 같은 로직으로 HTML을 파싱하며 파싱 결과의 treebuilder로 ElementTree, lxml, minidom을 모두 사용할 수 있다. 순수 파이썬으로 작성되어 성능은 느리다.

HTML을 대충 쉽게 처리하고 싶을 때는 BeautifulSoup이 편리하다. 다만, 오랫동안 쓰여왔던 3.x 버전과 최신 버전인 4.x 사이에 차이가 약간 있어서 구글링한 참조 코드들이 그대로 동작하지 않을 수도 있다. PyPI 패키지명도 달라서 3.x는 BeautifulSoup이고 4.x는 beautifulsoup4다. html5lib이 파싱을 제공하고 트리빌더를 선택할 수 있는 것과 반대로 BeautifulSoup은 파서를 선택할 수 있다. 예전에는 HTML을 pythonic하게 사용할 수 있는 라이브러리로 많이 쓰였으나, ElementTree가 널리 쓰이면서 존재 이유가 사라져가고 있다.

이외에 jQuery처럼 쓰기 위한 도구로 pyquery를 비롯한 몇몇 도구가 있다. pyquerylxml을 사용하여 성능과 사용성 모두를 충족시킨 예라고 할 수 있다. 그러나 jQuery가 필요할 정도로 HTML을 진지하게 다루어야 하는 경우에는 lxml을 쓰기 애매해다. HTML5를 제대로 다루지 못하기 떄문이다. 그러면 결국 html5lib을 파서로 쓰게 되는데, 그럼 성능 이득은 날아간다. 물론 그래도 pyquery를 이용하면 좀더 편리한 것은 사실.

TaskQueue#

celery가 좋음.

HTTP 클라이언트#

파이썬 표준 라이브러리에 urllib, urllib2, httplib 등이 있고 기타 다양한 라이브러리가 있지만 requests가 천하통일한 상태. 물론 대충 때워도 될 때는 urllib2가 답이다.

좀더 로봇스러운 동작을 쉽게 구현하고 싶은 경우에는 mechanize가 쓸만하다. 좀더 웹 브라우저에 가깝게 HTTP 클라이언트의 역할을 하고 싶다면 WebDriver를 쓰면 된다. 물론 WebDriver는 실제 브라우저를 돌릴 수도 있다.

비동기 통신#

socket.io의 파이썬 구현체로 gevent-socketio가 좋다. Django와 통합할 때도 django-socketio를 쓰는 것보다 그냥 gevent-socketio를 가져다가 적당히 붙여서 쓰는 게 더 편하다.

파서#

간단하게 파서를 만들고 싶을 때는 pyparsing이 짱이다. lex와 yacc의 파이썬 버전은 여러 가지가 있는데, PLY가 비교적 사용하기 쉽다. 파이썬 코드를 파싱하고 싶을 때는 ast 모듈을 쓰면 된다.

 

윈도우에서의 파이썬#


Comments


크리에이티브 커먼즈 라이선스
이 저작물은 크리에이티브 커먼즈 저작자표시 3.0 Unported 라이선스에 따라 이용할 수 있습니다.


Wiki at WikiNamu